1

在阅读 Entity Framework MSDN 中有关相关实体加载的学习文章时,我遇到了以下内容:

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

...[证明上述内容的示例]...

请注意,目前无法过滤加载了哪些相关实体。包含将始终存在于所有相关实体中。

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

例如,我可以为我正在查询的 DBSet 中Mother的每个指定导航属性,如下所示:ChildChildren

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

这是否意味着每个Father导航属性也将被热切评估Child

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

4

1 回答 1

3

是的,以这种方式突出显示有点令人困惑。而且您的困惑也是由于您碰巧专注于参考导航属性这一事实造成的。

看收藏就清楚了。

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

这意味着:您只能加载子集合中的所有实体,而不是满足某些条件的实体。永远不会加载除Include.

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

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

特别是当一个集合是Included 时:

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

可以过滤集合似乎很自然:

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

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

我认为这就是您所指的帖子中强调此限制的原因。


有没有办法在不指定它们的情况下急切加载所有导航属性

不,没有。那将是“危险的”,因为拥有很多Includes是真正的性能杀手。你最好Includes仔细指定。

于 2013-06-12T20:44:31.827 回答