【问题标题】:How does Linq Where(p => p.Parent == null) work in self-referencing table?Linq Where(p => p.Parent == null) 如何在自引用表中工作?
【发布时间】:2018-09-28 01:58:55
【问题描述】:

使用 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 实体及其子代的列表编辑只有“第一代”子代。当我省略 Where() 子句时,我会得到所有实体及其子代。

我不明白 为什么 Where() 子句有效。属于Children 集合的对象具有Parent。为什么不省略?

编辑:我的问题已得到解答,但请注意,我对 Include() 工作原理的理解是错误的。

【问题讨论】:

  • Where 子句只影响根元素。至于递归加载的孩子,情况可能并非如此,而是在最初包含的孩子之后延迟加载所有内容。

标签: entity-framework linq


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-08-20
    • 1970-01-01
    • 2021-12-20
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2021-01-17
    相关资源
    最近更新 更多