Entity framework 急切地/明确地加载“;“儿童”;仅将导航属性设置为“的实体”;“家长”;

Entity framework 急切地/明确地加载“;“儿童”;仅将导航属性设置为“的实体”;“家长”;,entity-framework,linq,ef-code-first,ef-core-2.1,Entity Framework,Linq,Ef Code First,Ef Core 2.1,我有一个EF Core 2.1代码优先模型,在两个类之间有“父-子”类型的关系: class Parent { public int Id {get; set;} public string Name {get; set;} } class Child { public int Id {get; set;} public string Description { get; set; } public Parent Parent { get; set; }

我有一个EF Core 2.1代码优先模型,在两个类之间有“父-子”类型的关系:

class Parent
{
    public int Id {get; set;}
    public string Name {get; set;}
}

class Child
{
    public int Id {get; set;}
    public string Description { get; set; }
    public Parent Parent { get; set; }
}
我想加载某个父实体,并确保其所有子实体都已加载。但是,Child没有导航属性,我无法修改这些类,因此无法添加一个

dbContext.Parents
    .Include(p => p.???)
    .Find(1);
我想我可以做第二个查询,在那里我可以反向查找所有内容:

dbContext.Children.Where(c => c.Parent.Id == loadedParent.Id)
但这似乎不是很有效,尤其是当你加载多个家长并做一些可怕的事情时:

var parentIds = loadedParents.Select(p => p.Id);
var children = dbContext.Children.Where(c => parentIds.Contains(c.Parent.Id));
当您只有“子级到父级”导航属性时,是否有方法确保加载实体

确保其所有子实体也已加载

因此,加载
子实体

var children = dbContext.Children.Include(c => c.Parent)
    .Where(c => c.Parent.Id == 1).ToList();
如果要获得多个父项,请使用比
c.Parent.Id==1更广泛的选择条件

如有必要,您可以通过访问
Local
集合列出已加载的父级:

va parents = dbContext.Parents.Local;

这真的是最有效的方法吗?看起来数据库查询很快就会变得指数级的复杂。至于效率,生成的SQL几乎与具有
parent.Children
的查询相同。至于复杂性,有一个谓词
Where(c=>c.Parent…
代替
Where(p=>p…
)。我看不出这种复杂性是如何呈指数级增长的。唯一的区别(与包括孩子相比)是你不会得到没有孩子的父母。如果这是一个问题,您应该使用GroupJoin(LINQ等效于外部连接)。对于多个父ID,最有效的方法是什么?是在(c=>parentIds.Contains(c.Id)的位置,还是有一种方法可以生成更好的SQL?
Contains
parentIds
不太长(几千)的情况下是可以的。如果是,您可以尝试一下。