【问题标题】:Eager Loading aggregate roots with Entity Framework使用实体框架急切加载聚合根
【发布时间】:2009-06-12 15:29:22
【问题描述】:

我想创建一种更结构化的方法来加载所需的实体树:

我需要大量数据,因此我使用类型安全的包含(只是普通的包含,但使用 Lambda)as shown here

正如我所说,我需要大量数据,基本上是 1 个父项下的整个实体树。

现在,我可以这样做:

context.House
    .Include(x => x.Doors)
    .Include(x => x.Doors.FirstOrDefault().Joint)
    .Include(x => x.Doors.FirstOrDefault().Joint.FirstOrDefault().JointCategory)
    .Include(x => x.Doors.FirstOrDefault().Joint.FirstOrDefault().JointCategory.JointType)
    .Include(x => x.Windows)
    // ... same thing
    .Include(x => x.Roof)
    // ... same thing

如您所见,这条充满包含的行会变得非常庞大。这实际上是一个非常简化的实际代码示例(顺便说一句,不包括房屋)

所以我想做的是创建方法,负责它在树中的分支。该方法可以接受对象查询并包含子对象,然后调用“子加载器方法”。此外,父级并不重要,只要它具有与子级类型相同的属性即可。

这可能没有多大意义:

public void LoadHouse(int id)
{
    // ...
    ObjectQuery<House> query = context.House;

    // and now?
    LoadDoors(query, x => x.Door);

}

public void LoadDoors<T>(ObjectQuery<T> query, ..?..)
{
    // ... ?

    LoadJoints(...)


}

等等。但我无法真正理解它......传入的查询和调用子方法之间缺少链接。

有人做过这样的事吗?或者谁能​​给我一些指点?

【问题讨论】:

    标签: entity-framework eager-loading aggregateroot


    【解决方案1】:

    试试这样的:

    query = LoadDoors(query, x => x.Door);

    LoadX 返回调用 Include 的结果。

    【讨论】:

    • 我不明白需要将表达式传递给 LoadDoors 方法,LoadDoors 方法肯定知道那个表达式吗?
    • 我也看不出将 void 更改为返回查询是如何解决此问题的。毕竟,查询是通过引用来的,所以我在方法中对它做的任何事情都会完成。
    • @Bertvan 因为 ReferenceEquals(q, q.Include("Foo")) == false
    • @andrew:没错,我昨天一整天都在为此苦苦挣扎。谢谢,这是一个正确的答案...
    猜你喜欢
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2014-02-18
    相关资源
    最近更新 更多