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

时间:2011-08-04 15:13:52

标签: c# entity-framework-4.1 code-first entity-relationship eager-loading

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

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; }
}

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

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

请详细说明如何做到这一点。提前谢谢。

2 个答案:

答案 0 :(得分:41)

你可以试试这个:

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

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

答案 1 :(得分:3)

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

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

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