Ich bin ziemlich neu in EF, und das ist etwas, das mich seit ein paar Tagen jetzt nervt:Wie erhält man eine EF-Abfrage, um das optimalste SQL zu kompilieren?
Ich habe eine User-Entität. Es hat einen übergeordneten WorkSpace, der eine Sammlung von Benutzern enthält. Jeder Benutzer verfügt in einer User.Schedules-Eigenschaft über eine Auflistung von untergeordneten Zeitplänen.
Ich bin durch die Objekte wie folgt navigieren:
var query = myUser.WorkSpace.Users.SelectMany(u => u.Schedules);
Wenn die Ergebnisse der query
Aufzählen (myUser ist eine Instanz von Benutzer, die zuvor unter Verwendung von .Find (Benutzer-ID) geladen worden ist), habe ich bemerkt, dass EF stellt für jeden Benutzer in WorkSpace eine Abfrage an die Datenbank. Benutzer
Warum kommt EF nicht die Ergebnisse in einer einzigen Abfrage, beginnend mit dem Primärschlüssel von myUser, und Beitritt mit allen beteiligten Tabellen?
Wenn ich etwas anderes direkt aus dem Kontext, wie dies zu tun, es funktioniert jedoch in Ordnung:
context.Users.Where(u => u.ID = userid).SelectMany(u => u.WorkSpace.Users.SelectMany(u => u.Schedules))
Gibt es etwas, was ich falsch mache?
Verwenden Sie '.Join' also EF versteht, was Sie erreichen möchten –
Aber was würde ich beitreten? Ich nehme an, ich würde etwas in meinem Kontext mitmachen, also ist es nicht viel anders als das zweite Beispiel, oder? –
Ich bin wahrscheinlich nicht am besten, das zu lösen, weil ich keine Navigationseigenschaften verwende, bleibe ich klar. Ich benutze nur Schlüssel und Joins die ganze Zeit, und wenn die Abfrage ein bisschen komplexer wird, feuere ich in Code gespeicherte Prozeduren, mit Dapper oder etwas –