【发布时间】:2020-04-03 01:13:19
【问题描述】:
我有一个小问题。我有以下表格及其关系:
Building
Batteries
Columns
Elevators
一座建筑可以有很多电池,电池可以有很多柱子,柱子可以有很多电梯。
一个电池有一个建筑物,一个柱子有一个电池,电梯有一个柱子。
如果我这样做var myintervention = _context.buildings.Where(b => b.batteries.Any(ba => ba.status == "Intervention")).ToList();,它将在我的查询中完美地返回具有干预状态的电池的建筑物列表(状态是一列)。
问题是我不能做像_context.buildings.Where(c => c.columns.Any...) 这样的事情,因为建筑模型无法访问列类,但电池可以......电梯也是如此,建筑物无法访问电梯, 列。
这是我定义模型构建器的方式:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Battery>()
.HasOne(p => p.buildings)
.WithMany(b => b.batteries)
.HasForeignKey(p => p.building_id);
modelBuilder.Entity<Column>()
.HasOne(p => p.batteries)
.WithMany(b => b.columns)
.HasForeignKey(p => p.battery_id);
modelBuilder.Entity<Elevator>()
.HasOne(p => p.columns)
.WithMany(b => b.elevators)
.HasForeignKey(p => p.column_id);
}
这是我的关系在我的模型中的样子:
building.cs
public List<Battery> batteries { get; set; }
battery.cs
public long building_id { get; set; }
public Building buildings { get; set; }
public List<Column> columns { get; set; }
column.cs
public long battery_id { get; set; }
public Battery batteries { get; set; }
public List<Elevator> elevators { get; set; }
elevator.cs
public long column_id { get; set; }
public Column columns { get; set; }
tl;博士;我想做一个 linq 查询来列出所有有电池、柱子或电梯的建筑物,它们的状态列是“干预”。
更新:显然这在某种程度上可行,但效率不高:
var myintervention = _context.buildings.Where(a => a.batteries.SelectMany(b => b.columns.SelectMany(c => c.elevators)).Any(c => c.status == "Intervention")).ToList();
好像不准确?有时有电池在干预,与这些电池关联的建筑物不会出现在建筑物列表中。电梯或柱子也是如此。我有点迷路了!
更新 2:这是我的要求:
[HttpGet("intervention")]
public List<Building> Getintervention(string status)
{
var myintervention = _context.buildings.Where(c => c.batteries.SelectMany(z => z.columns).Any(z => z.status == "Intervention")).ToList();
return myintervention;
}
【问题讨论】:
-
c.batteries.SelectMany(z => z.columns).Any可以吗? -
嗯,像
var myintervention = _context.buildings.Where(c => c.batteries.SelectMany(z => z.columns).Any(z => z.status == "Intervention")).ToList();这样的东西确实可以显示建筑物列表,但我确定它的链接是什么?当我检查所选建筑物的 id 时,它不对应于具有干预状态的列或电池 :( -
有没有机会让多个属性名称与单数/集合一致?例如battery.cs(应该称为Battery.cs)应该有
public Building Building- 它是令人困惑的 *!%# 有一个具有复数名称的属性(所以你假设它是一个集合)但它是一个对象(所以你希望能够说buildings.Where但你只能在集合上这样做。c# 中的属性名称以大写字母开头 -
@JeunePadawan 与其编辑掉你的问题,如果你觉得它不再有用,请删除它。
标签: c# mysql entity-framework linq