Linq中的链查询
本文关键字:查询 Linq | 更新日期: 2023-09-27 18:22:23
我有以下查询:
var ground = db
.Ground
.Where(g => g.RowKey == Ground_Uuid)
.ToList();
var building = db
.Building
.Where(b => ground.Any(gr => gr.RowKey == b.Ground.RowKey))
.ToList();
var floor = db
.Floor
.Where(b => building.Any(by => by.RowKey == b.Building.RowKey))
.ToList();
所以第二个依赖于第一个集合的id,依此类推。当执行到第二个查询时,我得到了以下错误:
无法创建"Domain.Model.Entitys.Ground"类型的常数值。在此上下文中仅支持基元类型或枚举类型。
有什么解决办法吗?
代码的问题是ToList
正在将结果转换为内存中的对象,并且内存中的一组对象无法与数据库中的一套数据连接。
var ground = db.Ground.Where(g => g.RowKey == Ground_Uuid);
var building = db.Building.Where(b => ground.Any(gr => gr.RowKey == b.Ground.RowKey));
var floor = db.Floor.Where(b => building.Any(by => by.RowKey == b.Building.RowKey));
此外,坦率地说,在阅读了@juharr的评论后,我看到了楼层、建筑和建筑之间的关系;地由于你已经在做b.Building.RowKey
,b.Ground.RowKey
预测关系很容易,我完全同意,它可以简化为:-
var floor = db.Floor.Where(b => b.Building.Ground.RowKey == Ground_Uuid);
第一个查询似乎是多余的。您已经知道,每行的RowKey
列将等于Ground_Uuid
。
var building = db.Building.Where(b => b.Ground.RowKey == Ground_Uuid);
var floor = db.Floor.Where(b => b.Building.Ground.RowKey == Ground_Uuid);
删除ToList()可以完成这项工作,但如果RowKey是外键,则可以使用Linq:
var floor = db.Floor
.Where(b => b.Building.Ground.RowKey == Ground_Uuid)
.ToList();