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
InformationsquelleAutor AJ. | 2010-10-18
Schreibe einen Kommentar