Linq-to-Entités: JOINTURE EXTERNE GAUCHE avec la clause where et de projection

Je vais avoir un heckuva temps à essayer de comprendre comment traduire une simple SQL JOINTURE EXTERNE GAUCHE avec deux condition de la clause where dans un travail de Linq-to-interroger des Entités. Il y a seulement deux tables. J'ai besoin de valeurs pour toutes les lignes de la table Table1, indépendamment de matches dans Table2, mais la clause where utilise les champs de Table2. En SQL, les deux paramètres Table2WhereColumn1 et Table2WhereColumn2, et la requête (qui fonctionne) ressemble à ceci:

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

J'ai essayé d'utiliser Group Join avec DefaultIfEmpty(), ainsi qu'une jointure implicite (sans Join mot-clé), et je ne reçois que des lignes pour les éléments qui ont des valeurs dans la Table2. Je suis sûr que cela ne va pas aider, mais voici un exemple de l'Linq j'ai essayé cela ne fonctionne pas:

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

OriginalL'auteur AJ. | 2010-10-18