使用实体框架加载嵌套实体/集合

Ami*_*mit 18 c# entity-relationship code-first eager-loading entity-framework-4.1

我试图在一次调用中急切地加载所有相关实体或实体集合.我的实体看起来像:

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; }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是,如果我调用一个方法来加载所有Employees,结果应该包括Person,EmployeeTitles列表,包括Title的代码和描述我已经能够到达第三级,即获得员工和人员列表EmployeeTitle.我不知道如何使用EmployeeTitle获取标题信息.我的代码是:

Context.Employees.Include("Person").Include(e => e.Titles).ToList();
Run Code Online (Sandbox Code Playgroud)

请详细说明如何实现这一目标.提前致谢.

Sla*_*uma 41

你可以试试这个:

Context.Employees
    .Include(e => e.Person)
    .Include(e => e.Titles.Select(t => t.Title))
    .ToList();
Run Code Online (Sandbox Code Playgroud)

Select 可以应用于集合并加载对象图中下一级别的导航属性.

  • 重要提示:不要意外地为两个lambda表达式使用相同的变量`.Include(x => x.Titles.Select(x => x.Title))`或者你将得到`无法将lambda表达式转换为type'字符串'因为它不是委托类型` (9认同)
  • 您必须"使用System.Data.Entity",否则它将显示为此重载不存在. (5认同)

小智 5

由于这是我在谷歌搜索中的第一页,所以我只想发布此内容。

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

    Context.Employees
        .Include(e => e.Person)
        .Include(e => e.Titles.Select(t => t.Title))
        .Load();
Run Code Online (Sandbox Code Playgroud)