In Situationen, in denen der Zugriff auf Daten das Verknüpfen mehrerer Tabellen mit angegebenen Bedingungen erfordert, bietet LINQ to SQL ein wirksames Mittel solche Operationen durchzuführen. Dieser Artikel befasst sich mit einem bestimmten Szenario, in dem zum Abrufen von Daten ein Left Outer Join mit mehreren Join-Bedingungen erforderlich ist.
Erste Abfrage und Herausforderung
Betrachten Sie die folgende SQL-Abfrage:
SELECT f.value FROM period AS p LEFT OUTER JOIN facts AS f ON p.id = f.periodid AND f.otherid = 17 WHERE p.companyid = 100
Die Aufgabe besteht darin, diese Abfrage in einen LINQ-Ausdruck zu übersetzen. Während es in LINQ Standardmethoden für die Durchführung von Left-Outer-Joins gibt (z. B. mit DefaultIfEmpty()), stellt die Einbindung der zusätzlichen Join-Bedingung f.otherid = 17 eine Herausforderung dar.
Lösung: Platzieren der Join-Bedingung Vor DefaultIfEmpty()
Der Schlüssel zur Bewältigung dieser Herausforderung besteht darin, die Join-Bedingung vor dem Aufruf einzuführen DefaultIfEmpty(). Dies kann entweder mithilfe der Syntax der Erweiterungsmethode oder einer Unterabfrage erreicht werden:
// Using extension method syntax from p in context.Periods join f in context.Facts on p.id equals f.periodid into fg from fgi in fg.Where(f => f.otherid == 17).DefaultIfEmpty() where p.companyid == 100 select f.value; // Using a subquery from p in context.Periods join f in context.Facts on p.id equals f.periodid into fg from fgi in (from f in fg where f.otherid == 17 select f).DefaultIfEmpty() where p.companyid == 100 select f.value;
Erläuterung der Platzierung der Join-Bedingung
Die Bedingung AND f.otherid = 17 ist Teil davon den Join, da er sicherstellt, dass nur Zeilen aus der Faktentabelle, die diese Bedingung erfüllen, mit den entsprechenden Zeilen aus der Periodentabelle verknüpft werden. Durch Platzieren dieser Bedingung in der WHERE-Klausel nach dem Join würden alle Zeilen aus der Periodentabelle ausgeschlossen, die keine übereinstimmende Zeile in der Faktentabelle haben, selbst wenn diese Zeilen andernfalls die Bedingung erfüllen würden. Durch die Angabe der Bedingung im Join bewahren wir das gewünschte Verhalten.
Das obige ist der detaillierte Inhalt vonWie implementiert man einen Left Outer Join mit mehreren Bedingungen in LINQ to SQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!