LINQ to SQL : maîtriser les jointures externes gauches avec plusieurs critères
La traduction de requêtes SQL en LINQ to SQL peut être délicate, en particulier avec des jointures complexes. Cet article se concentre sur un scénario courant : effectuer une jointure externe gauche avec plusieurs conditions.
Le défi SQL :
Notre point de départ est une requête SQL utilisant une jointure externe gauche entre les tables « période » et « faits ». La jointure utilise deux conditions : 'p.id = f.periodid' et 'f.otherid = 17'. La deuxième condition fait office de filtre.
L'obstacle LINQ :
La méthodeLINQ DefaultIfEmpty()
est l'approche habituelle pour les jointures externes gauches. Cependant, ajouter simplement 'f.otherid = 17' à une clause where
après la jointure ne fonctionne pas comme prévu.
Solutions LINQ efficaces :
La clé est d'appliquer la deuxième condition de jointure avant d'utiliser DefaultIfEmpty()
. Voici deux méthodes efficaces :
Méthode 1 : Utilisation de la syntaxe de la méthode d'extension :
<code class="language-csharp">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 fgi.value</code>
Méthode 2 : Utilisation d'une sous-requête :
<code class="language-csharp">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 fgi.value</code>
Pourquoi cela fonctionne :
La différence cruciale réside dans le placement de la condition. Mettre 'f.otherid == 17' dans la clause where
après DefaultIfEmpty()
filtrerait les lignes où 'f' est nul (car la jointure n'a pas trouvé de correspondance). En le plaçant dans la clause Where()
avant DefaultIfEmpty()
, nous filtrons avant les valeurs nulles sont introduites, garantissant ainsi le comportement correct de la jointure externe gauche. Notez que nous sélectionnons fgi.value
plutôt que f.value
pour gérer correctement les valeurs nulles dans la première méthode.
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!