是否包括加载所有相关实体或指定实体



在阅读一篇关于实体框架MSDN中相关实体加载的学习文章时,我遇到了以下内容:

也可以急切加载多个级别的相关实体。下面的查询显示了如何为这两者执行此操作的示例集合和引用导航属性。

…[示例]…

注意目前还不能过滤哪个相关的实体被加载。包括将永远在所有相关的实体。

这似乎有点令人困惑,因为这两个陈述似乎相互矛盾。我遗漏了什么吗?

例如,我可以指定Mother导航属性应该包含在我正在查询的Children DBSet中的每个Child,如下所示:

Dim myQuery = From children In context.Children.Include("Mother")
              Select child

这是否意味着Father导航属性也将为每个Child急切地评估?

如果不是这样(Include只急切地加载你告诉它的东西),有没有一种方法来急切加载所有导航属性而不指定它们?

是的,这样高亮显示有点令人困惑。你的困惑也是由于你碰巧关注了参考导航属性。

查看集合就很清楚了。

目前无法筛选加载的相关实体

意味着:你只能在子集合中加载所有实体,而不是满足某些条件的实体。永远不会加载Include中指定的其他导航属性。

Include方法最初是带有您所显示的字符串参数的方法。后来,添加了一个扩展方法,允许通过表达式指定导航属性:

context.Children.Include(c => c.Mother)

特别是当一个集合是Include d:

context.Parents.Include(c => c.Children)

看起来很自然,这个集合可以被过滤:

context.Parents.Include(c => c.Children.Where(x => x.IsActive))

编译,但这是不可能的(运行时异常)。原因是表达式仅用于获取nav属性的名称,以便调用原始Include方法(带字符串参数)。

我想这就是为什么你提到的文章强调这个限制的原因。


有没有一种方法可以在不指定它们的情况下快速加载所有导航属性

不,没有。这将是"危险的",因为拥有许多Includes是一个真正的性能杀手。您最好仔细指定Includes

最新更新