C# 如何在C中使用Linq从多个嵌套列中选择特定字符串?
我这里有个小问题。我有以下表格及其关系:C# 如何在C中使用Linq从多个嵌套列中选择特定字符串?,c#,mysql,entity-framework,linq,C#,Mysql,Entity Framework,Linq,我这里有个小问题。我有以下表格及其关系: Building Batteries Columns Elevators 一座建筑物可以有许多电池,电池可以有许多柱子,柱子可以有许多电梯 一个电池有一个建筑,一个柱子有一个电池,一个电梯有一个柱子 如果我执行这个var myintervention=\u context.buildings.Whereb=>b.batters.Anyba=>ba.status==Intervention.ToList;在我的查询中,如果返回一个
Building
Batteries
Columns
Elevators
一座建筑物可以有许多电池,电池可以有许多柱子,柱子可以有许多电梯
一个电池有一个建筑,一个柱子有一个电池,一个电梯有一个柱子
如果我执行这个var myintervention=\u context.buildings.Whereb=>b.batters.Anyba=>ba.status==Intervention.ToList;在我的查询中,如果返回一个包含电池的建筑物列表,并且“干预状态”为一列,则效果会非常好
问题是我不能做像_context.buildings.Wherec=>c.columns.Any这样的事情。。。因为建筑模型没有访问column类的权限,但是电池有。。。电梯也是一样,建筑物没有电梯,柱子有
下面是我如何定义modelBuilder的:
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);
}
看起来好像不准确?有时干预中有电池,与这些电池关联的建筑不会出现在建筑列表中。电梯或柱子也是如此。。我有点迷路了
更新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;
}
首先,请修复模型,使集合具有复数名称,而对象具有单个名称,否则您的代码将变得非常混乱:
building.cs
public List<Battery> Batteries { get; set; }
battery.cs
public long BuildingId { get; set; }
public Building Building { get; set; }
public List<Column> Columns { get; set; }
column.cs
public long BatteryId { get; set; }
public Battery Battery { get; set; }
public List<Elevator> Elevators { get; set; }
elevator.cs
public long ColumnId { get; set; }
public Column Columns { get; set; }
现在,让我们向模型添加更多属性,以便它可以告诉我们有关干预的信息:
building.cs
public List<Battery> Batteries { get; set; }
[NotMapped]
public bool IsInIntervention => this.Status == "Intervention" || Batteries.Any(b => b.IsInIntervention);
battery.cs
public long BuildingId { get; set; }
public Building Building { get; set; }
public List<Column> Columns { get; set; }
[NotMapped]
public bool IsInIntervention => this.Status == "Intervention" || Columns.Any(c => c.IsInIntervention);
column.cs
public long BatteryId { get; set; }
public Battery Battery { get; set; }
public List<Elevator> Elevators { get; set; }
[NotMapped]
public bool IsInIntervention => this.Status == "Intervention" || Elevators.Any(e => e.IsInIntervention);
elevator.cs
public long ColumnId { get; set; }
public Column Column { get; set; }
[NotMapped]
public bool IsInIntervention => this.Status == "Intervention";
现在,你可以问一栋建筑是否符合规定,如果是,它会说是,或者它拥有的任何东西符合规定
注意:如果模型没有加载实体,那么您可能需要采用这样的技巧:有条件地加载它们c.batters.SelectManyz=>z.columns.Any是否有效?嗯,类似var myintervention=\u context.buildings.Wherec=>c.batters.SelectManyz=>z.columns.Anyz=>z.status==Intervention.ToList;是否可以显示建筑物列表,但我确定它链接了什么?当我检查所选建筑物的ID时,它与干预状态的列或电池不对应:您是否有可能使多个属性名称与单数/集合一致?例如battery.cs应该被称为battery.cs应该有公共建筑-这让人混淆为*!%有一个复数名称的属性,所以你假设它是一个集合,但它是一个单一的对象,所以你可以说它是建筑物,但你只能在集合上这样做。c中的属性名称以大写字母开头Letter@JeunePadawan不要编辑掉你的问题,如果你觉得它不再有用,请删除它。哇,非常感谢所有这些。。。是的,我现在只是在改变一切,但我总是犯错误,考虑到已经凌晨2点了,我太累了。不过我很好奇,你会如何查询IsiInervation?我用我的请求更新了主要帖子。如果这不合理,我很抱歉,明天早上我会把所有的东西都读回来。非常感谢你的帮助,我真的很感激。看起来我无法在模型中执行bool,我得到了以下错误:System.Linq.dll中发生了类型为“System.ArgumentNullException”的异常,但未在用户代码中处理:“Value can not null.”。试图修复它,但我不够好,我想可能是因为数据没有加载,所以例如build.batters是空的;你看到我粘贴的关于使用include/thenclude查询的链接了吗?我们在谈论的建筑物/电池/柱子/电梯有多少?它现在可以工作了!编辑问题以显示答案!可能不应该对一个问题进行如此剧烈的编辑,从而使答案变得毫无意义——将您的编辑作为答案发布,您可以接受它,并用向上投票的方式标记任何其他有用的答案。要访问问题的编辑版本,请复制您当前的编辑,将问题还原到先前的编辑,并将复制的文本作为答案发布,请点击问题上的“编辑的x分钟前”链接
var vara = _context.maintable.Where(a => a.tablerelatedtomain.SelectMany(b => b.tablerelatedtoprevious).SelectMany(c => c.tablerelatedtoprevious).Any(c => c.status == "mystring")).ToList();
var varb = _context.maintable.Where(a => a.tablerelatedtomain.SelectMany(b => b.tablerelatedtoprevious).Any(b => b.status == "mystring")).ToList();
var varc = _context.maintable.Where(a => a.tablerelatedtomain.Any(a => a.status == "mystring")).ToList();
var result = vara.Union(varb).Union(varc).OrderBy(z => z.id).ToList();
return result;
building.cs
public List<Battery> Batteries { get; set; }
[NotMapped]
public bool IsInIntervention => this.Status == "Intervention" || Batteries.Any(b => b.IsInIntervention);
battery.cs
public long BuildingId { get; set; }
public Building Building { get; set; }
public List<Column> Columns { get; set; }
[NotMapped]
public bool IsInIntervention => this.Status == "Intervention" || Columns.Any(c => c.IsInIntervention);
column.cs
public long BatteryId { get; set; }
public Battery Battery { get; set; }
public List<Elevator> Elevators { get; set; }
[NotMapped]
public bool IsInIntervention => this.Status == "Intervention" || Elevators.Any(e => e.IsInIntervention);
elevator.cs
public long ColumnId { get; set; }
public Column Column { get; set; }
[NotMapped]
public bool IsInIntervention => this.Status == "Intervention";
var vara = _context.maintable.Where(a => a.tablerelatedtomain.SelectMany(b => b.tablerelatedtoprevious).SelectMany(c => c.tablerelatedtoprevious).Any(c => c.status == "mystring")).ToList();
var varb = _context.maintable.Where(a => a.tablerelatedtomain.SelectMany(b => b.tablerelatedtoprevious).Any(b => b.status == "mystring")).ToList();
var varc = _context.maintable.Where(a => a.tablerelatedtomain.Any(a => a.status == "mystring")).ToList();
var result = vara.Union(varb).Union(varc).OrderBy(z => z.id).ToList();
return result;