首先使用EF 2.0 Core代码,我有以下实体来定义一个自引用表:
class EntityX
{
public int EntityXId { get; set; }
public string Name { get; set; }
public int? ParentId { get; set; }
//navigation properties
public EntityX Parent { get; set; }
public ICollection<EntityX> Children { get; set; }
}
我希望以树的形式检索所有EntityX对象及其子项
我可以使用:
var entities = context.EntityX
.Include(p => p.Parent)
.Include(p => p.Children)
.Where(p => p.Parent == null);
当我致电entities.ToList()
时,这会让我得到我想要的内容:parent
个实体的列表及其子女仅<编辑&#39;首先&#39;一代孩子。当我省略Where()
条款时,我会得到所有实体及其子代。
我不明白为什么 Where()
子句有效。属于Children
集合的对象具有Parent
。为什么不省略?
修改:我的问题已得到解答,但请注意我对Include()的工作方式有误。
答案 0 :(得分:3)
LINQ仅将Where
条件应用于要查询的集合中的对象。您选择使用Include
方法加载的其他内容是不受相同条件限制。实际上,EF没有提供限制关联实体的直接方法(see this Q&A)。
这就是顶级查询为您带来预期效果的方式。 EF使用父ID通过单独的RDBMS查询递归检索子项以获取其所有子项。来自Where
方法的限制不会使其成为子查询。