Maison >développement back-end >C++ >Comment effectuer des jointures externes gauche dans LINQ en utilisant des méthodes d'extension?

Comment effectuer des jointures externes gauche dans LINQ en utilisant des méthodes d'extension?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-24 10:01:09305parcourir

How to Perform Left Outer Joins in LINQ Using Extension Methods?

Utilisez les méthodes d'extension LINQ pour effectuer une jointure externe gauche

Une jointure externe gauche est une opération de jointure qui renvoie toutes les lignes du tableau de gauche (appelée table « parent »), et uniquement les lignes correspondantes du tableau de droite (appelée table « enfant »). Si une ligne correspondante n'est pas trouvée dans la table enfant, la valeur de retour de cette ligne dans la table parent est nulle.

Dans LINQ, une façon d'effectuer une jointure externe gauche consiste à utiliser la méthode Join, qui crée une séquence typée anonyme contenant les attributs des tables parent et enfant. Cependant, un moyen plus pratique d'obtenir le même résultat consiste à utiliser les méthodes d'extension GroupJoin et SelectMany.

La syntaxe de jointure externe gauche utilisant les méthodes d'extension est la suivante :

<code class="language-csharp">var query = parentTable.GroupJoin(
    childTable, 
    parentKeySelector,
    childKeySelector,
    (parent, child) => new { Parent = parent, Child = child.DefaultIfEmpty() })
    .SelectMany(
        x => x.Child,
        (x, y) => new { Parent = x.Parent, Child = y });</code>

Dans cette syntaxe :

  • parentTable et childTable sont les tables à rejoindre.
  • parentKeySelector et childKeySelector sont des expressions lambda qui spécifient la clé utilisée pour joindre les deux tables.
  • Le type anonyme dans la méthode
  • GroupJoin combine les lignes parent et enfant.
  • La méthode
  • DefaultIfEmpty() garantit que null est renvoyé pour les lignes enfants qui n'ont pas de ligne parent correspondante.
  • La méthode
  • SelectMany aplatit une séquence de types anonymes en une seule séquence, chaque élément représentant une ligne de la table parent et la ligne enfant correspondante (ou null si aucune ligne enfant correspondante n'existe).

Exemple

Considérez la requête de jointure externe gauche suivante en SQL :

<code class="language-sql">SELECT f.*, b.*
FROM Foo f
LEFT JOIN Bar b ON f.Foo_Id = b.Foo_Id;</code>

Cette requête peut être exprimée à l'aide d'une méthode d'extension comme suit :

<code class="language-csharp">var query = Foo.GroupJoin(
    Bar, 
    f => f.Foo_Id,
    b => b.Foo_Id,
    (f, b) => new { Foo = f, Bar = b.DefaultIfEmpty() })
    .SelectMany(
        x => x.Bar,
        (f, b) => new { Foo = f.Foo, Bar = b });</code>

Cette requête renverra une séquence de types anonymes, où chaque type contient des propriétés des tables Foo et Bar. Si une ligne de la table Foo n'a aucune ligne correspondante dans la table Bar, la propriété Bar correspondante sera nulle.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn