18

我试图在一次调用中急切地加载所有相关实体或实体集合。 我的实体是这样的:使用实体框架加载嵌套实体/集合

Class Person 
{ 
    public virtual long Id { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
} 

Class Employee 
{ 
    public virtual long Id { get; set; } 
    public DateTime AppointmentDate { get; set; } 
    public virtual ICollection<EmployeeTitle> Titles { get; set; } 
    public virtual Person Person { get; set; } 
} 

Class EmployeeTitle 
{ 
    public virtual long Id { get; set; } 
    public virtual bool IsCurrent { get; set; } 
    public virtual Title Title { get; set; } 
} 
Class Title 
{ 
    public virtual long Id { get; set; } 
    public virtual string Code { get; set; } 
    public virtual string Description { get; set; } 
} 

什么荫试图做的是,如果我打电话给加载所有员工的方法,其结果应包括人,EmployeeTitles包括标题 代码和说明的名单我已经能够以达到第三级即获得员工与员工和EmployeeTitle列表。我不知道如何使用EmployeeTitle获得标题信息。 我的代码来获得这样的:

Context.Employees.Include("Person").Include(e => e.Titles).ToList(); 

请阐明如何做到这一点一些轻。提前致谢。

回答

40

你可以试试这个:

Context.Employees 
    .Include(e => e.Person) 
    .Include(e => e.Titles.Select(t => t.Title)) 
    .ToList(); 

Select可以应用到对象图中下一级的集合,并加载导航属性。

+0

完美:)非常感谢。 – Amit

+8

重要提示:不要为两个lambda表达式'.Include(x => x.Titles.Select(x => x.Title))''使用相同的变量',否则您将得到'无法将lambda表达式转换为类型'字符串',因为它不是委托类型' –

+4

您必须具有“使用System.Data.Entity”,否则会出现此超载不存在的情况。 –

3

由于这是我在谷歌搜索的第一页,我只是想发布这个。

Slauma的回答很好。但如果你不打算实际使用列表,建议使用Load()而不是ToList()。所以它会是:

Context.Employees 
     .Include(e => e.Person) 
     .Include(e => e.Titles.Select(t => t.Title)) 
     .Load();