Maison >développement back-end >C++ >Comment puis-je effectuer une jointure extérieure gauche dans Linq sans utiliser de clauses `join-on-equals-into`?
C # Linq jointures extérieures gauche: une alternative à join-on-equals-into
La mise en œuvre d'une jointure extérieure gauche dans LINQ sans la syntaxe standard join-on-equals-into
peut être difficile. Alors que les jointures intérieures ont des implémentations simples, les jointures extérieures gauche nécessitent une stratégie différente. Explorons une idée fausse commune puis la bonne approche.
Une tentative défectueuse:
Une approche fréquente, mais incorrecte, tente d'utiliser une affectation conditionnelle dans la clause select
pour imiter une jointure extérieure gauche:
<code class="language-csharp">// Incorrect approach List<JoinPair> leftFinal = (from l in lefts from r in rights select new JoinPair { LeftId = l.Id, RightId = (l.Key == r.Key) ? r.Id : 0 });</code>
Cette méthode ne représente pas avec précision une jointure extérieure gauche car elle génère plusieurs entrées pour les éléments côté gauche avec plusieurs éléments correspondants, et il ne gère pas correctement les cas où il n'y a pas de correspondance sur le côté droit pour un Élément côté gauche.
La méthode correcte en utilisant DefaultIfEmpty()
:
L'approche recommandée exploite la méthode DefaultIfEmpty()
. Cette méthode gère avec élégance l'absence d'éléments côté droit correspondant.
Voici comment effectuer une jointure extérieure gauche efficacement:
<code class="language-csharp">var q = from l in lefts join r in rights on l.Key equals r.Key into ps_jointable from p in ps_jointable.DefaultIfEmpty() select new { LeftId = l.Id, RightId = p?.Id ?? 0 };</code>
Ce code effectue d'abord une jointure de groupe (into ps_jointable
). DefaultIfEmpty()
assure alors que même si ps_jointable
est vide (aucune correspondance à droite), elle donnera toujours un seul élément, permettant à la clause select
suivante de traiter chaque élément côté gauche. L'opérateur conditionnel nul (?.
) et l'opérateur de coalescing nul (??
) gèrent en toute sécurité la valeur potentielle null
de p.Id
, en attribuant 0 comme par défaut si aucune correspondance n'est trouvée. Cela reflète avec précision le comportement d'une jointure extérieure 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!