EF: Include with where-Klausel

Wie der Titel andeutet, suche ich nach einer Möglichkeit, eine where-Klausel in Kombination mit einem include zu erstellen.

Hier sind meine Situationen: Ich bin verantwortlich für die Unterstützung einer großen Anwendung voller Code-Gerüche. Das Ändern von zu viel Code führt überall zu Fehlern, daher suche ich nach der sichersten Lösung.

Nehmen wir an, ich habe ein Objekt Bus und ein Objekt People (Bus hat eine Navigationsstütze Collection of People). In meiner Abfrage muss ich alle Busse mit nur den Passagieren auswählen, die wach sind. Dies ist ein einfaches Dummy-Beispiel

Im aktuellen Code:

var busses = Context.Busses.Where(b=>b.IsDriving == true);
foreach(var bus in busses)
{
   var passengers = Context.People.Where(p=>p.BusId == bus.Id && p.Awake == true);
   foreach(var person in passengers)
   {
       bus.Passengers.Add(person);
   }
}

Nach diesem Code wird der Context freigegeben und in der aufrufenden Methode werden die resultierenden Bus-Entities einer DTO-Klasse (100% Kopie von Entity) zugeordnet.

Dieser Code ruft mehrfach DB auf, was ein No-Go ist. Deshalb habe ich diese Lösung gefundenAuf MSDN-Blogs

Dies hat beim Debuggen des Ergebnisses sehr gut funktioniert, aber wenn die Entitäten dem DTO (Using AutoMapper) zugeordnet werden, wird die Ausnahme angezeigt, dass der Kontext / die Verbindung geschlossen wurde und das Objekt nicht geladen werden kann. (Der Kontext ist immer geschlossen. Dies kann nicht geändert werden :()

Ich muss also sicherstellen, dass die ausgewählten Passagiere bereits geladen sind (IsLoaded auf der Navigationseigenschaft ist ebenfalls False). Wenn ich die Passagiersammlung inspiziere, wirft der Graf auch die Ausnahmebedingung, aber es gibt auch eine Sammlung in der Sammlung von Passagieren, die als "umschlossene verbundene Entitäten" bezeichnet wird und meine gefilterten Objekte enthält.

Gibt es eine Möglichkeit, diese umschlossenen verwandten Entitäten in die gesamte Sammlung zu laden? (Ich kann die Automapper-Mapping-Konfiguration nicht ändern, da dies in der gesamten Anwendung verwendet wird.)

Gibt es einen anderen Weg, um die aktiven Passagiere zu bekommen?

Jeder Hinweis ist willkommen ...

Bearbeiten

Die Antwort von Gert Arnold funktioniert nicht, weil die Daten nicht schnell geladen werden. Aber wenn ich es vereinfache und lösche, wo es geladen ist. Dies ist wirklich seltsam, da die Execute-SQL in beiden Fällen alle Passagiere zurückgibt. Es muss also ein Problem geben, wenn die Ergebnisse in die Entität zurückgespielt werden.

Context.Configuration.LazyLoadingEnabled = false;
var buses = Context.Busses.Where(b => b.IsDriving)
        .Select(b => new 
                     { 
                         b,
                         Passengers = b.Passengers
                     })
        .ToList()
        .Select(x => x.b)
        .ToList();
Edit2

Nach viel Kampf die Antwort von Gert Arnold Arbeit! Wie Gert Arnold vorschlug, müssen Sie Lazy Loading deaktivieren und es AUS lassen. Dies erfordert einige zusätzliche Änderungen an der Anwendung, da der frühere Entwickler Lazy Loading geliebt hat. -_-

Antworten auf die Frage(2)

Ihre Antwort auf die Frage