我有以下疑问:
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'的常量值。在此上下文中仅支持原始类型或枚举类型。
任何想法如何解决?
答案 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.RowKey
,b.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();