c# - 如何在 C# 中使用 Linq 从多个嵌套列中选择特定字符串?
问题描述
我这里有个小问题。我有下表及其关系:
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...)
的事情,因为建筑模型无法访问列类,但电池可以......电梯也是如此,建筑物无法访问电梯,列可以。
这是我定义我的 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);
}
这是我的关系在我的模型中的样子:
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;
}
解决方案
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;
推荐阅读
- javascript - Javascript 测验应用程序给出与单选按钮相关的错误
- vue.js - 单元测试运行正常,但最后它返回 npm 错误
- azure-devops - 仅在一个项目中向需求添加字段(Azure devops)
- ios - XCode SpriteKit 模板未呈现全屏
- javascript - 如何使用 T 在泛型函数中创建泛型对象?
- typescript - 数组对象分配问题
- json - 如何在颤振中使用硬编码的json响应
- java - 暂停 AnimationDrawable 并恢复
- tableau-api - 无法使集合成为成员的总和
- r - 使用验证功能在闪亮中给出错误消息