如果Root
实体集不是太大,您可以尝试显式加载(语法DbContext
):
var roots = context.Roots.Where(someCondition).ToList();
foreach (var root in roots)
root.Children = context.Entry(root).Collection(r => r.Children)
.Query().ToList();
这适用于任何类型的关系,包括多对多关系。有 1 + N 个查询,如果 N 太大,与急切加载相比,它可能会在性能方面适得其反。
Root
如果和之间的关系Child
不是多对多的,您可以利用关系修复,它是上下文 (或) 的一个功能,可确保在实体加载或附加到上下文时自动构建对象图:ObjectContext
DbContext
var roots = context.Roots.Where(someCondition).ToList();
var rootIds = roots.Select(r => r.Id);
context.Children.Where(c => rootIds.Contains(c.Root.Id)).Load();
(我假设这里Child
有一个反向导航属性Root
。)
无论加载了多少实体,这始终是两个查询。Root
关系修复将root.Children
自动为每个附加的集合填充集合,root
以便结果看起来就像您使用了急切加载:
var roots = context.Roots.Include("Children").Where(someCondition).ToList();
不幸的是,如果集合很大,该Contains
方法很慢: https ://stackoverflow.com/a/8108643/270591 。但是,当您使用急切加载时,它仍然可能比数据重复造成的性能损失要好到一定数量。rootIds
rootIds
更喜欢其中一种选择是一个测试问题。我无法给出一般建议来使用适合所有情况的一种或另一种选择。