在对实体框架MSDN中的相关实体加载进行学习article时,我遇到了以下内容:
也可能急切地加载多个相关级别 实体即可。下面的查询显示了如何为两者执行此操作的示例 集合和参考导航属性。
... [展示上述内容的例子] ......
请注意,目前无法过滤哪些相关内容 实体已加载。包含将始终与所有相关 实体。
这似乎有些令人困惑,因为这两个陈述似乎彼此矛盾。我在这里错过了什么吗?
例如,我可以指定我要查询的Mother
DBSet中的每个Child
都应包含Children
导航属性,如下所示:
Dim myQuery = From children In context.Children.Include("Mother")
Select child
这是否意味着每个Father
都会热切评估Child
导航属性?
如果不是这种情况(Include
只是急切地加载你告诉它的内容),有没有办法急切加载所有导航属性而不指定它们?
答案 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
。