Entity framework Linq(p=>;p.Parent==null)在自引用表中是如何工作的?
使用EF 2.0 Core,代码优先,我有一个定义自引用表的实体:Entity framework Linq(p=>;p.Parent==null)在自引用表中是如何工作的?,entity-framework,linq,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 IColle
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; }
}
当我调用entities.ToList()
时,这会得到我想要的:一个parent
实体及其子实体的列表edit仅“第一代”子实体。当我省略Where()
子句时,我得到所有实体及其子实体
我不明白为什么Where()
子句有效。属于子对象
集合的对象有一个父对象
。为什么不省略呢
编辑:回答了我的问题,但请注意,我对Include()的工作原理的理解是错误的。LINQ将
条件应用于所查询集合中的对象。使用Include
方法加载的任何其他内容都不受相同条件的约束。事实上,EF没有提供限制关联实体()的直接方法
这就是顶级查询为您带来所需内容的方式。EF使用父ID通过单独的RDBMS查询递归地检索子项以获取其所有子项。Where
方法的限制不适用于子查询。Where
子句只影响根元素。对于递归加载的子级,情况可能并非如此,而是在最初包含的子级之后延迟加载所有内容。
var entities = context.EntityX
.Include(p => p.Parent)
.Include(p => p.Children)
.Where(p => p.Parent == null);