Esta puede ser una pregunta realmente elementry, pero ¿cuál es una buena manera de incluir varias entidades secundarias al escribir una consulta que abarca TRES niveles (o más)?
es decir, tengo 4 tablas: Company
, Employee
, Employee_Car
yEmployee_Country
La empresa tiene una relación de 1: m con el empleado.
El empleado tiene una relación de 1: m con Employee_Car y Employee_Country.
Si quiero escribir una consulta que devuelva los datos de las 4 tablas, actualmente estoy escribiendo:
Company company = context.Companies
.Include("Employee.Employee_Car")
.Include("Employee.Employee_Country")
.FirstOrDefault(c => c.Id == companyID);
Tiene que haber una manera más elegante! Esto es largo aliento y genera SQL horrendo
Estoy usando EF4 con VS 2010
linq
entity-framework
lazy-loading
Nathan Liu
fuente
fuente
//inside public static class Extensions public static IQueryable<Company> CompleteCompanies(this DbSet<Company> table){ return table .Include("Employee.Employee_Car") .Include("Employee.Employee_Country") ; } //code will be... Company company = context.Companies.CompleteCompanies().FirstOrDefault(c => c.Id == companyID); //same for next advanced method
EF 4.1 a EF 6
Hay un tipo fuertemente tipado
.Include
que permite especificar la profundidad requerida de la carga ansiosa al proporcionar expresiones Select a la profundidad adecuada:El Sql generado en ambos casos todavía no es intuitivo, pero parece lo suficientemente eficiente. 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 :Según los documentos, mantendría la 'sangría' adicional
.ThenInclude
para preservar su cordura.Información obsoleta (no haga esto):
La carga de varios nietos podría realizarse en un solo paso, pero esto requiere una reversión bastante incómoda de la copia de seguridad del gráfico antes de dirigirse hacia el siguiente nodo (NB: esto NO funciona
AsNoTracking()
; obtendrá un error de tiempo de ejecución):Por lo tanto, me quedaría con la primera opción (un Incluir por modelo de profundidad de entidad de hoja).
fuente
Puede encontrar este artículo de interés que está disponible en codeplex.com .
El artículo presenta una nueva forma de expresar consultas que abarcan varias tablas en forma de formas gráficas declarativas.
Además, el artículo contiene una comparación exhaustiva del rendimiento de este nuevo enfoque con consultas EF. Este análisis muestra que GBQ supera rápidamente las consultas EF.
fuente
¿Cómo se construye una consulta LINQ to Entities para cargar objetos secundarios directamente, en lugar de llamar a una propiedad Reference o Load ()
No hay otra manera, excepto implementar la carga diferida.
O carga manual ...
fuente