Mam czas heckuva zastanawiający się, jak przetłumaczyć proste SQL LEFT OUTER JOIN z dwoma warunkami, gdzie klauzula w działającym kwerendzie Linq-to-Entities . Są tylko dwie tabele. Potrzebuję wartości dla wszystkich wierszy z tabeli 1, niezależnie od dopasowań w tabeli 2, ale klauzula WHERE używa pól z tabeli 2. W SQL, oba parametry byłyby Table2WhereColumn1 i Table2WhereColumn2, a zapytanie (które działa) wygląda następująco:Linq-to-Entities: LEFT OUTER JOIN z klauzul WHERE i projekcją
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
Próbowałem za pomocą Group Join
z DefaultIfEmpty()
, jak również ukryte join (bez rzeczywista Join
słowo kluczowe), a otrzymuję tylko wiersze dla elementów, które mają wartości w tabeli 2. Jestem pewien, że to nie pomoże, ale tutaj jest przykład LINQ Próbowałem, że nie działa:
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
Outstanding! Działa jak marzenie. Nie jestem pewien, czy rozumiem, jak działa klauzula Where, ale działa. –