update query multiple framework data columns all c# linq entity-framework extension-methods

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:

  1. from q in _context.Cars : la consulta solo devolverá las columnas de Car
  2. join s in _context.Shares : Car + Share columnas
  3. join p in _context.SharePeople : Car + Share + SharePeople columns. Aquí está el Incluir .
  4. select p , solo columnas de SharePeople

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