Saltar al contenido

Entity framework linq query Include () múltiples entidades secundarias

Solución:

Utilice métodos de extensión. Reemplazar NameOfContext con el nombre de su contexto de objeto.

public static class Extensions{
   public static IQueryable<Company> CompleteCompanies(this NameOfContext context){
         return context.Companies
             .Include("Employee.Employee_Car")
             .Include("Employee.Employee_Country") ;
     }

     public static Company CompanyById(this NameOfContext context, int companyID){
         return context.Companies
             .Include("Employee.Employee_Car")
             .Include("Employee.Employee_Country")
             .FirstOrDefault(c => c.Id == companyID) ;
      }

}

Entonces tu código se convierte en

     Company company = 
          context.CompleteCompanies().FirstOrDefault(c => c.Id == companyID);

     //or if you want even more
     Company company = 
          context.CompanyById(companyID);

EF 4.1 a EF 6

Hay un tipado fuerte .Include que permite especificar la profundidad requerida de carga ansiosa proporcionando expresiones Select a la profundidad apropiada:

using System.Data.Entity; // NB!

var company = context.Companies
                     .Include(co => co.Employees.Select(emp => emp.Employee_Car))
                     .Include(co => co.Employees.Select(emp => emp.Employee_Country))
                     .FirstOrDefault(co => co.companyID == companyID);

El SQL generado no es de ninguna manera intuitivo, pero parece lo suficientemente eficaz. He puesto un pequeño ejemplo en GitHub aquí.

EF Core

EF Core tiene un nuevo método de extensión, .ThenInclude(), aunque la sintaxis es ligeramente diferente:

var company = context.Companies
                     .Include(co => co.Employees)
                           .ThenInclude(emp => emp.Employee_Car)
                     .Include(co => co.Employees)
                           .ThenInclude(emp => emp.Employee_Country)

Con algunas notas

  • Según arriba (Employees.Employee_Car y Employees.Employee_Country), si necesita incluir 2 o más propiedades secundarias de una colección secundaria intermedia, deberá repetir el .Include navegación de la colección para cada elemento secundario de la colección.
  • Según los documentos, mantendría la ‘sangría’ adicional en el .ThenInclude para preservar tu cordura.

Puede encontrar este artículo de interés que está disponible en codeplex.com.

  • Mejora del rendimiento de las consultas de Entity Framework mediante consultas basadas en gráficos.

El artículo presenta una nueva forma de expresar consultas que abarcan varias tablas en forma de gráficos declarativos.

Además, el artículo contiene una comparación exhaustiva del rendimiento de este nuevo enfoque con las consultas EF. Este análisis muestra que GBQ supera rápidamente a las consultas de EF.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *