Linq的链查询

时间:2015-11-17 13:32:05

标签: c# entity-framework linq

我有以下疑问:

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.Entities.Ground'的常量值。在此上下文中仅支持原始类型或枚举类型。

任何想法如何解决?

3 个答案:

答案 0 :(得分:2)

您的代码存在的问题是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);

答案 1 :(得分:1)

似乎第一个查询是多余的。您已经知道每行的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);

答案 2 :(得分:1)

删除ToList()可以完成这项工作,而且如果RowKey是外键,你可以使用Linq:

var floor = db.Floor
    .Where(b => b.Building.Ground.RowKey == Ground_Uuid)
    .ToList();