Include是否加载所有相关实体或指定的实体?

时间:2013-06-12 19:21:02

标签: entity-framework entity-relationship navigation-properties

在对实体框架MSDN中的相关实体加载进行学习article时,我遇到了以下内容:

  

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

     

... [展示上述内容的例子] ......

     

请注意,目前无法过滤哪些相关内容   实体已加载。包含将始终与所有相关   实体。

这似乎有些令人困惑,因为这两个陈述似乎彼此矛盾。我在这里错过了什么吗?

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

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

这是否意味着每个Father都会热切评估Child导航属性?

如果不是这种情况(Include只是急切地加载你告诉它的内容),有没有办法急切加载所有导航属性而不指定它们?

1 个答案:

答案 0 :(得分:3)

是的,以这种方式突出显示它有点令人困惑。而你的困惑也是因为你碰巧专注于参考导航属性。

看看收藏品就清楚了。

  

目前无法过滤加载了哪些相关实体

表示:您只能在子集合中加载所有实体,而不能满足某些条件的实体。 永远不会加载其他导航属性,而不会加载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