c# - query - ¿Por qué no Incluir tiene algún efecto?
query data entity framework (2)
Estoy haciendo la siguiente consulta LINQ que funciona pero no devuelve la propiedad de navegación Persona llena, obtengo null
.
public IEnumerable<SharePeople> GetSharePeopeByCarId(int carId)
{
return from q in _context.Cars
join s in _context.Shares
on q.CarId equals s.Car.CarId
join p in _context.SharePeople.Include(p => p.Person)
on s.ShareId equals p.ShareId
where q.CarId == carId
select p;
}
No tengo idea de por qué, ya que cuando hago el método de extensión regular como _context.SharePeople.Include(p => p.Person)
funciona.
Esta publicación describe claramente cuándo Include
tiene y no tiene efecto.
La parte crítica es la forma de la consulta, es decir, las columnas seleccionadas. Si algo cambia la forma después de un Include
, el Include
ya no funciona.
En su consulta la forma cambia cuatro veces, en estas partes de la declaración:
-
from q in _context.Cars
: la consulta solo devolverá las columnas deCar
-
join s in _context.Shares
:Car
+Share
columnas -
join p in _context.SharePeople
:Car
+Share
+SharePeople
columns. Aquí está el Incluir . -
select p
, solo columnas deSharePeople
Una vez que te das cuenta, el remedio es simple:
(from q ... select p).Include(p => p.Person)
Esto también se aplica cuando la forma de la consulta aparentemente no cambia, pero la consulta produce una proyección. Supongamos que tiene select new { q, s, p }
. Esto aún seleccionaría Car
+ Share
+ SharePeople
columnas, lo mismo que antes de Include
. Sin embargo, la consulta produce un tipo anónimo. Este tipo en sí no tiene ninguna propiedad de navegación que pueda ser completada por un Include
, así que de nuevo, el Include
no hace nada. Esto es por diseño .
Usar el enfoque ste-fu no funcionó, pero con una variación de él pude ponerlo a funcionar.
Supongo que Gert Arnold respondió por qué no funciona, pero desde que lo conseguí trabajando aquí está el código:
var sharePeople = Context.SharePeople.Include("Person");
return sharePeople.Where(s => s.Shares.Car.CarId == carId);