Maison >développement back-end >C++ >Comment les méthodes d'extension peuvent-elles simplifier les jointures externes gauche dans LINQ?

Comment les méthodes d'extension peuvent-elles simplifier les jointures externes gauche dans LINQ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-24 10:12:10696parcourir

How Can Extension Methods Simplify Left Outer Joins in LINQ?

Utilisation de la méthode d'extension de jointure externe gauche de LINQ

L'exécution de jointures externes dans LINQ peut être réalisée en utilisant une combinaison des méthodes Join et DefaultIfEmpty. Cependant, pour améliorer la lisibilité et la simplicité du code, les méthodes d’extension offrent un moyen plus pratique d’exprimer ces opérations.

Utilisez des méthodes d'extension pour effectuer des jointures externes gauches, considérez la syntaxe suivante :

<code class="language-csharp">Foo.GroupJoin(Bar, f => f.Foo_Id, b => b.Foo_Id, (f,b) => ...)
    .Select(...)</code>

Dans cette syntaxe :

  • GroupJoin Regroupe les éléments de la première séquence (Foo) selon un sélecteur à clé et le joint à la deuxième séquence (Bar) à l'aide d'un sélecteur à clé compatible.
  • Le résultat est une collection énumérable de tuples, où chaque tuple contient un élément de la première séquence et une collection énumérable groupée d'éléments de la deuxième séquence.
  • SelectMany permet d'aplatir les éléments groupés et de les combiner avec la première séquence.
  • DefaultIfEmpty est utilisé pour garantir que s'il n'y a aucun élément correspondant dans la deuxième séquence, une valeur par défaut est renvoyée.

Pour terminer la jointure externe gauche, les étapes restantes consistent à effectuer une sélection sur les éléments combinés. Dans ce cas, la méthode Select peut être utilisée pour projeter les propriétés souhaitées de chaque tuple.

Par exemple, pour exprimer une jointure externe gauche entre Foo et Bar basée sur la colonne Foo_Id, vous pouvez utiliser le code suivant :

<code class="language-csharp">var qry = Foo.GroupJoin(
          Bar, 
          foo => foo.Foo_Id, 
          bar => bar.Foo_Id,
          (x,y) => new { Foo = x, Bars = y })
       .SelectMany(
           x => x.Bars.DefaultIfEmpty(),
           (x,y) => new { Foo=x.Foo, Bar=y});</code>

Ce code génère une collection énumérable de types anonymes, où chaque type contient une propriété Foo de la table Foo et une propriété Bar de la table Bar (ou null si aucune barre correspondante n'existe).

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