Linq Where(p => p.Parent == null)如何在自引用表中工作?

时间:2018-04-18 00:25:36

标签: entity-framework linq

首先使用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()的工作方式有误。

1 个答案:

答案 0 :(得分:3)

LINQ仅将Where条件应用于要查询的集合中的对象。您选择使用Include方法加载的其他内容是受相同条件限制。实际上,EF没有提供限制关联实体的直接方法(see this Q&A)。

这就是顶级查询为您带来预期效果的方式。 EF使用父ID通过单独的RDBMS查询递归检索子项以获取其所有子项。来自Where方法的限制不会使其成为子查询。