Linq-to-Entities: LEFT OUTER JOIN mit WHERE-Klausel und Projektion
Bin ich ein heckuva Zeit, herauszufinden, wie zu übersetzen eine einfache SQL LEFT OUTER JOIN mit zwei Bedingungen where-Klausel in eine funktionierende Linq-to-Entities-Abfrage. Es gibt nur zwei Tabellen. Ich brauche die Werte für alle Zeilen von Tabelle1, unabhängig von übereinstimmungen in Tabelle2, aber die WHERE-Klausel verwendet Felder aus Tabelle2. In SQL werden die beiden Parameter wäre Table2WhereColumn1 und Table2WhereColumn2, und die Abfrage (und die funktioniert) sieht so aus:
SELECT t1.Table1Id,
t1.FieldDescription,
t2.FieldValue
FROM Table1 t1 WITH (NOLOCK)
LEFT JOIN Table2 t2 WITH (NOLOCK) ON t1.Table1Id = t2.Table1Id
WHERE (t2.Table2WhereColumn1 = @someId OR t2.Table2WhereColumn1 IS NULL)
AND (t2.Table2WhereColumn2 = @someOtherId OR t2.Table2WhereColumn2 IS NULL)
ORDER BY t1.OrderByColumn
Ich habe versucht, mit Group Join
mit DefaultIfEmpty()
sowie einen impliziten join (ohne die eigentliche Join
Schlüsselwort), und bekomme ich nur die Zeilen für die Elemente, für die Werte in Tabelle2. Ich bin sicher, dies wird nicht helfen, aber hier ist ein Beispiel von Linq-ich hab schon versucht, dass funktioniert nicht:
Public Shared Function GetProfilePreferencesForCedent(ByVal dc As EntityContext, _
ByVal where1 As Int32, _
ByVal where2 As Int32) _
As IQueryable(Of ProjectedEntity)
Return From t1 In dc.Table1
Group Join t2 In dc.Table2 _
On t1.Table1Id Equals t2.Table1Id _
Into t2g1 = Group _
From t2gx In t2g1.DefaultIfEmpty(Nothing)
Where (t2gx.Table2Where1 = where1 Or t2gx.Table2Where1 = Nothing) _
And (t2gx.Table2Where2 = where2 Or t2gx.Table2Where2 = Nothing)
Order By t1.SortOrder
Select New ProjectedEntity With {
.Table1Id = t1.Table1Id, _
.FieldDescription = t1.FieldDescription, _
.FieldValue = If(t2gx Is Nothing, String.Empty, t2gx.FieldValue) _
}
End Function
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben einen gehen auf diese Fragen, und sagen Sie mir, wenn Sie für Sie arbeiten. Habe ich noch nicht eingerichtet, die Daten zu testen, aber Sie sollten in Ordnung sein.
Bitte verzeihen Sie meine Mischung aus C# & VB.NET. Früher war ich ein VB.NET Entwickler, aber in den letzten paar Jahren habe ich überwiegend gearbeitet, in C#, so fühle ich mich jetzt wohler.
Hier sind die Klassen, die ich erstellt für
Table1
&Table2
:Nun die Abfrage in C# sein soll:
Sowie der übersetzung in VB.NET:
Lassen Sie mich wissen, wenn Sie arbeiten. Ich drücke die Daumen. 🙂
Persönlich, wenn es gibt, wo die Bedingungen für die Rechte Seite eines left join habe ich in der Regel bevorzugen setzen Sie Sie in die join-Kriterien
In diesem Fall die SQL würde das so Aussehen:
Den LINQ-code (in C#) würde wie folgt Aussehen:
nicht getestet - sollte aber funktionieren
Werde ich nicht nehmen Kredit für diese Antwort aber es ist wunderschön: LINQ to SQL - Left Outer Join mit mehreren join-Bedingungen
Im wesentlichen mit extension-Methode where-Klausel in der Unterabfrage, aber Sie müssen es vor
DefaultIfEmpty()
: