【问题标题】:Does Include load all related entities or the specified ones?Include 是否加载所有相关实体或指定实体?
【发布时间】:2013-06-12 19:21:02
【问题描述】:

在学习article Entity Framework MSDN 中的相关实体加载时,我遇到了以下情况:

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

...[上述示例]...

请注意,目前无法过滤哪些相关 实体已加载。包括将永远存在于所有相关的 实体。

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

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

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

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

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

【问题讨论】:

  • 通过当前不过滤,一种意味着您不能只加载年龄小于 30 岁的母亲,而是加载所选孩子的所有母亲。

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


【解决方案1】:

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

看集合就清楚了。

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

这意味着:您只能在子集合中加载所有个实体,而不是满足某些条件的实体。 绝不会加载除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))

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

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


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

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

【讨论】:

  • 在此说明中,您完全可以编写一个扩展方法来包含所有导航属性(尽管这可能是个坏主意)
  • @LukeMcGregor 当然。我认为 OP 正在寻找开箱即用的解决方案。 IIRC 在 SO 提供了这样的扩展方法的答案。但同样,我不会使用它们。模型中看似天真的变化可能会在意想不到的地方产生巨大的影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 2011-04-09
相关资源
最近更新 更多