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"类型的常数值。在此上下文中仅支持基元类型或枚举类型。

有什么解决办法吗?

Linq中的链查询

代码的问题是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.RowKeyb.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();