是否有任何方法可以在自引用关系中包含子对象。例如,我有一个像这样的对象:
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;
但ChildActivities - &gt; Documents对象总是为null,有没有包含这些的方法?
答案 0 :(得分:4)
您可以使用“虚线路径”来包含更深层次的导航属性。对于您的示例,您可以写:
from act in context.Activities
.Include("Documents")
.Include("ChildActivities.Documents")
where act.Id == id
select act;
此处不需要显式Include("ChildActivities")
,因为EF将自动包含所有实体,这些实体位于所包含的最终导航属性的路径中。
BTW:如果您使用的是EF&gt; = 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;
答案 1 :(得分:0)
一种方法是利用Entity Framework的Lazy Loading功能。
您需要通过在导航属性中添加virtual
关键字来稍微更改对象,以便它们符合EF requirements for creating POCO proxies:
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
的{{1}},而无需明确加载它们(通过Eager/Explicit loading)。