LINQ to SQL : jointure externe gauche avec plusieurs conditions de jointure
Dans LINQ to SQL, traduction de requêtes SQL impliquant des jointures externes gauches avec plusieurs jointures les conditions peuvent être difficiles. Cet article traite d'un scénario dans lequel une requête SQL avec une jointure externe gauche et une condition de jointure supplémentaire doit être convertie en LINQ.
Requête SQL
SELECT f.value FROM period as p LEFT OUTER JOIN facts AS f ON p.id = f.periodid AND f.otherid = 17 WHERE p.companyid = 100
Traduction LINQ
L'implémentation LINQ typique d'une jointure externe gauche utilisant DefaultIfEmpty() peut être simple, mais l'incorporation de la condition de jointure supplémentaire nécessite examen attentif.
La tentative initiale suivante, bien que syntaxiquement correcte, ne donne pas le résultat souhaité :
from p in context.Periods join f in context.Facts on p.id equals f.periodid into fg from fgi in fg.DefaultIfEmpty() where p.companyid == 100 && fgi.otherid == 17 select f.value
Pour obtenir le comportement souhaité, la condition de jointure supplémentaire doit être introduite avant d'appeler DefaultIfEmpty (). Ceci est accompli en utilisant soit la syntaxe de la méthode d'extension, soit une sous-requête :
Syntaxe de la méthode d'extension
from p in context.Periods join f in context.Facts on p.id equals f.periodid into fg from fgi in fg.Where(f => f.otherid == 17).DefaultIfEmpty() where p.companyid == 100 select f.value
Sous-requête
from p in context.Periods join f in context.Facts on p.id equals f.periodid into fg from fgi in (from f in fg where f.otherid == 17 select f).DefaultIfEmpty() where p.companyid == 100 select f.value
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!