LINQ to SQL: Left Outer Joins mit mehreren Kriterien beherrschen
Das Übersetzen von SQL-Abfragen in LINQ to SQL kann schwierig sein, insbesondere bei komplexen Verknüpfungen. Dieser Artikel konzentriert sich auf ein häufiges Szenario: die Durchführung eines Left Outer Joins mit mehreren Bedingungen.
Die SQL-Herausforderung:
Unser Ausgangspunkt ist eine SQL-Abfrage, die einen linken äußeren Join zwischen den Tabellen „Periode“ und „Fakten“ verwendet. Der Join verwendet zwei Bedingungen: „p.id = f.periodid“ und „f.otherid = 17“. Die zweite Bedingung fungiert als Filter.
Die LINQ-Hürde:
LINQs DefaultIfEmpty()
-Methode ist der übliche Ansatz für Left Outer Joins. Das einfache Hinzufügen von „f.otherid = 17“ zu einer where
-Klausel nach der Verknüpfung funktioniert jedoch nicht wie erwartet.
Effektive LINQ-Lösungen:
Der Schlüssel besteht darin, die zweite Join-Bedingung anzuwenden, bevor DefaultIfEmpty()
verwendet wird. Hier sind zwei effiziente Methoden:
Methode 1: Syntax der Erweiterungsmethode verwenden:
<code class="language-csharp">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 fgi.value</code>
Methode 2: Verwendung einer Unterabfrage:
<code class="language-csharp">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 fgi.value</code>
Warum das funktioniert:
Der entscheidende Unterschied liegt in der Platzierung der Erkrankung. Das Einfügen von „f.otherid == 17“ in die where
-Klausel after DefaultIfEmpty()
würde Zeilen herausfiltern, in denen „f“ null ist (da der Join keine Übereinstimmung gefunden hat). Indem wir es in die Where()
-Klausel vor DefaultIfEmpty()
einfügen, filtern wir bevor die Nullwerte eingeführt werden, um das korrekte Verhalten des linken äußeren Joins sicherzustellen. Beachten Sie, dass wir fgi.value
anstelle von f.value
auswählen, um Nullen in der ersten Methode korrekt zu verarbeiten.
Das obige ist der detaillierte Inhalt vonWie führe ich einen Left Outer Join mit mehreren Bedingungen in LINQ to SQL durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!