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
yEmployees.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.