18

Estoy tratando de cargar con entusiasmo todas las entidades relacionadas o colección de Entity en una sola llamada. Mis Entidades ve así:Cargando entidades anidadas/colecciones con Entity Framework

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

Lo Iam tratando de hacer es que si yo llamo un método para cargar todos los empleados, el resultado debería incluir persona, Lista de EmployeeTitles incluyendo el código y la descripción del título he podido para llegar al tercer nivel, es decir, obtener el empleado con la persona y la lista de EmployeeTitle. No sé cómo obtener la información del título con EmployeeTitle. Mi código para conseguir esto es:

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

Por favor, arrojar algo de luz sobre la manera de lograr esto. Gracias por adelantado.

Respuesta

40

Puede probar esto:

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

Select se puede aplicar a una colección y cargas de navegación propiedades del siguiente nivel en el gráfico de objetos.

+0

Perfecto :) Muchas gracias. – Amit

+8

IMPORTANTE: no utilice accidentalmente la misma variable para ambas expresiones lambda '.Include (x => x.Titles.Select (x => x.Title))' o obtendrá 'No se puede convertir la expresión lambda para escribir ' cadena 'porque no es un tipo de delegado' –

+4

Debe tener "using System.Data.Entity", de lo contrario aparecerá ya que esta sobrecarga no existe. –

3

Dado que esta es la primera página en mi búsqueda en google, solo quería publicar esto.

La respuesta de Slauma está bien. Pero se recomienda utilizar Load() en lugar de ToList() si no planea usar realmente la lista. Entonces sería:

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