Dans les situations où l'accès aux données implique la jointure de plusieurs tables avec des conditions spécifiées, LINQ to SQL fournit un moyen efficace pour effectuer de telles opérations. Cet article se penche sur un scénario spécifique dans lequel une jointure externe gauche avec plusieurs conditions de jointure est requise pour récupérer des données.
Requête initiale et défi
Considérez la requête SQL suivante :
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
La tâche est de traduire cette requête en une expression LINQ. Bien qu'il existe des méthodes standard pour effectuer des jointures externes gauches dans LINQ (par exemple, en utilisant DefaultIfEmpty()), l'incorporation de la condition de jointure supplémentaire f.otherid = 17 présente un défi.
Solution : placer la condition de jointure Avant DefaultIfEmpty()
La clé pour relever ce défi est d'introduire la condition de jointure avant d'invoquer DefaultIfEmpty(). Ceci peut être réalisé en utilisant soit la syntaxe de la méthode d'extension, soit une sous-requête :
// Using extension method syntax 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; // Using a subquery 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;
Explication du placement de la condition de jointure
La condition AND f.otherid = 17 fait partie de la jointure car elle garantit que seules les lignes de la table de faits qui remplissent cette condition sont jointes aux lignes correspondantes de la table de périodes. Placer cette condition dans la clause WHERE après la jointure exclurait toutes les lignes de la table de périodes qui n'ont pas de ligne correspondante dans la table de faits, même si ces lignes satisferaient autrement à la condition. En précisant la condition dans la jointure, on préserve le comportement souhaité.
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!