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
Vous devez vous connecter pour publier un commentaire.
Avoir un aller à ces requêtes et me dire si ils travaillent pour vous. Je n'ai pas les données de test, mais ils devraient être fine.
Veuillez excuser mon mélange de C# & VB.NET. J'ai utilisé pour être un VB.NET développeur, mais dans les deux dernières années, j'ai travaillé principalement en C#, donc je me sens maintenant plus à l'aise.
Voici les classes que j'ai créé pour
Table1
&Table2
:Maintenant la requête en C# doit être:
Et la traduction en VB.NET:
Laissez-moi savoir si elles fonctionnent. Je croise les doigts. 🙂
OriginalL'auteur Enigmativity
Personnellement si il y a des cas où les conditions pour le côté droit d'une jointure gauche en général, je préfère les mettre dans les critères de jointure
Dans ce cas, le SQL ressemblerait à:
LINQ code (en C#) ressemblerait à:
pas testé mais devrait fonctionner
Vraiment sympa de la syntaxe. Je suis d'accord sur le plus SQL-comme la sensation.
OriginalL'auteur James S
Je ne vais pas prendre le crédit pour cette réponse, mais c'est magnifique: LINQ to SQL - Jointure Externe Gauche avec plusieurs conditions de jointure
Essentiellement, l'utilisation de la méthode d'extension de la clause where sur la sous-requête, mais vous devez l'utiliser avant
DefaultIfEmpty()
:OriginalL'auteur Kristopher