【问题标题】:Eager-loading a tree of entities急切加载实体树
【发布时间】:2014-01-01 20:01:31
【问题描述】:

我知道如何eager load multiple levels of entities with an include statement。但是如果我正在加载一棵树呢?考虑这种实体层次结构:

  • 阿尔法
    • Bravo //一个集合
      • 查理//一个集合
      • Delta //一个集合

现在假设我要加载添加了所有 Bravo、Charlie 和 Delta 实体的 Alpha 实体。这可以通过单个Include 语句来完成吗?我怀疑答案是否定的,但我想确定一下。

否则,我怀疑我会简单地使用两个Include 语句。但即使这样也让我停下来,因为这意味着我必须引用 Bravo 两次(每个 Include 一次)语句,我不知道这是否会使 EF 感到困惑。

【问题讨论】:

    标签: c# .net entity-framework eager-loading


    【解决方案1】:

    这可以通过两个这样的包含来完成:

    var entities = context.Alphas.Include("Bravos.Charlies")
                                 .Include("Bravos.Deltas");
    

    或者这个:

    var entities = context.Alphas.Include(a => a.Bravos.Select(b => b.Charlies))
                                 .Include(a => a.Bravos.Select(b => b.Deltas));
    

    显然 First 更优雅。

    【讨论】:

    • 但是第二个是由编译器进行类型检查的,如果你的模型发生变化,它可以防止运行时异常。
    【解决方案2】:

    不,它不能用一个包含来完成。

    您可以像这样链接包含:

    var entities = context.Alphas.Include("Bravos").Include("Bravos.Charlies").Include("Bravos.Deltas");
    

    【讨论】:

    • 真的吗?如何在一个 Include 中访问所有这些实体? Bravo 有两个集合属性?
    • 抱歉,我没看到。但您的代码仍然有一个额外的包含。它可以通过两个包含来完成 context.Alphas.Include("Bravos.Charlies").Include("Bravos.Deltas"); 不需要 Bravos,请参阅:msdn.microsoft.com/en-us/data/jj574232#eagerLevels
    • @Selman22:是的,你是对的。但我想证明在多个包含中使用 Bravo 是可以的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2012-02-07
    • 1970-01-01
    • 2011-04-02
    • 2017-09-28
    • 2013-06-11
    • 2012-09-10
    相关资源
    最近更新 更多