Jointure externe gauche LINQ to SQL avec filtrage multi-conditions
Dans LINQ to SQL, une jointure externe gauche permet la récupération de tous enregistrements de la table de gauche, même s'il n'y a aucun enregistrement correspondant dans la table de droite. Lors d'une requête utilisant une jointure externe gauche, il peut s'avérer nécessaire d'appliquer des conditions de filtrage supplémentaires à la table jointe.
Considérez l'instruction 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
Cette requête récupère la valeur du table "faits" pour chaque enregistrement de la table "période", même s'il n'y a aucun enregistrement correspondant dans la table "faits". De plus, il applique un filtre supplémentaire pour inclure uniquement les enregistrements pour lesquels la colonne "otherid" dans la table "facts" est égale à 17.
Pour traduire cette requête en LINQ, les étapes suivantes peuvent être suivies :
var query = 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;
La principale différence avec une jointure externe gauche standard réside dans l'utilisation de la méthode Where() sur la table jointe "fg" avant d'appeler DefaultIfEmpty(). Cela garantit que la condition de filtrage supplémentaire est appliquée avant d'exclure potentiellement tout enregistrement en raison d'un résultat de jointure vide.
Une approche alternative implique l'utilisation d'une sous-requête :
var query = 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;
Ces deux approches atteignent l'objectif résultat souhaité de l’exécution d’une jointure externe gauche avec plusieurs conditions de jointure. Il est important de comprendre que placer la condition de filtrage supplémentaire dans la clause WHERE après JOIN peut ne pas produire le comportement souhaité, car cela pourrait entraîner l'exclusion d'enregistrements qui devraient être inclus en raison de la jointure externe gauche.
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!