Maison >développement back-end >C++ >Comment effectuer des jointures externes gauche dans LINQ en utilisant des méthodes d'extension?
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. GroupJoin
combine les lignes parent et enfant. DefaultIfEmpty()
garantit que null est renvoyé pour les lignes enfants qui n'ont pas de ligne parent correspondante. 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!