0

有没有办法在自引用关系中包含子对象。例如,我有一个这样的对象:

class Activity
{
    public int Id {get;set;}
    public String Name {get;set;}

    public IList<Document> Documents {get;set;}
    public IList<Activity> ChildActivities {get;set;}
}

我在 linq 中这样称呼它:

from act in context.Activities.Include("Documents").Include("ChildActivities")
                      where act.Id == id
                      select act;

但是 ChildActivity -> Documents 对象始终为空,有没有办法也包括这些?

4

2 回答 2

4

您可以使用“虚线路径”来包含更深层次的导航属性。对于您的示例,您可以编写:

from act in context.Activities
    .Include("Documents")
    .Include("ChildActivities.Documents")
where act.Id == id
select act;

Include("ChildActivities")此处不需要显式,因为 EF 将自动包含所有实体,这些实体位于包含的最终导航属性的路径上。

顺便说一句:如果您使用的是 EF >= 4.1,那么您有一个可用的强类型版本Include,它将 lambda 表达式作为参数:

using System.Data.Entity; // <- this namespace is required for the lambda-Include

//...

from act in context.Activities
    .Include(a => a.Documents)
    .Include(a => a.ChildActivities.Select(ca => ca.Documents))
where act.Id == id
select act;
于 2013-07-12T19:57:17.260 回答
0

一种方法是利用 Entity Framework 的延迟加载功能。

您需要通过向virtual导航属性添加关键字来稍微更改您的对象,以便它们满足创建 POCO 代理的 EF 要求

public class Activity
{
    public int Id {get;set;}
    public String Name {get;set;}

    public virtual IList<Document> Documents {get;set;}
    public virtual IList<Activity> ChildActivities {get;set;}
}

您现在应该能够访问Documents您的,ChildActivities而无需显式加载它们(通过Eager/Explicit loading)。

于 2013-07-12T14:14:52.997 回答