Warum hat Include keinen Effekt?

Ich mache die folgende LINQ-Abfrage, die funktioniert, aber die Navigationseigenschaft Person filled nicht zurückgibt, bekomme ich null .

 public IEnumerable 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; } 

Ich habe keine Ahnung warum, denn wenn ich die reguläre Erweiterungsmethode wie _context.SharePeople.Include(p => p.Person) funktioniert es.

   

Dieser Beitrag beschreibt deutlich, wenn Include wirkt und nicht.

Der kritische Teil ist die Form der Abfrage, dh die ausgewählten Spalten. Wenn nach einem Include die Form geändert wird, funktioniert das Include nicht mehr.

In Ihrer Anfrage ändert sich die Form viermal in diesen statementsteilen:

  1. from q in _context.Cars : Die Abfrage würde nur Car Spalten zurückgeben
  2. join s in _context.Shares : Car + Share Spalten
  3. join p in _context.SharePeople : Car + Share + SharePeople Spalten. Hier ist das Include .
  4. SharePeople select p , nur SharePeople Spalten

Sobald Sie sich dessen bewusst sind, ist das Heilmittel einfach:

 (from q ... select p).Include(p => p.Person) 

Dies gilt auch, wenn sich die Form der Abfrage scheinbar nicht ändert, die Abfrage jedoch eine Projektion erzeugt. Angenommen, Sie hätten ein select new { q, s, p } . Dies würde immer noch Car + Share + SharePeople Spalten auswählen, genauso wie vor dem Include . Die Abfrage erzeugt jedoch einen anonymen Typ. Dieser Typ selbst hat keine Navigationseigenschaften, die von einem Include könnten. Das Include macht also nichts. Das ist Absicht .

Mit Ste-Fu-Ansatz hat es nicht funktioniert, aber mit einer Variation davon konnte ich es umsetzen.

Ich denke, Gert Arnold hat geantwortet, warum es nicht funktioniert, aber seit ich es hier funktioniert habe, ist der Code:

var sharePeople = Context.SharePeople.Include("Person");

return sharePeople.Where(s => s.Shares.Car.CarId == carId);