Maison >développement back-end >C++ >Comment puis-je effectuer une jointure multi-champs dans une seule requête LINQ ?
Jointure multi-champs à requête unique dans LINQ
Lorsque vous effectuez des opérations de jointure dans LINQ, vous devez généralement joindre des tables sur plusieurs champs en même temps. Bien qu'il soit possible d'ajouter des contraintes supplémentaires à une jointure à l'aide de la clause where
, ce n'est pas toujours l'approche la plus efficace ou la plus lisible.
Afin de joindre plusieurs champs en une seule connexion, des types anonymes peuvent être utilisés. Par exemple, le code suivant joint les tables field1
et field2
en fonction des champs entity
et entity2
:
<code class="language-csharp">var result = from x in entity join y in entity2 on new { x.field1, x.field2 } equals new { y.field1, y.field2 } select new { x, y }; // 选择结果</code>
Dans cet exemple, les types anonymes new { x.field1, x.field2 }
et new { y.field1, y.field2 }
sont utilisés pour créer un nouveau type qui contient uniquement les champs utilisés pour la jointure. Ces types de valeurs sont ensuite comparés à l'aide de l'opérateur equals
pour effectuer la jointure. Enfin, l'instruction select new {x, y}
sélectionne le résultat concaténé, contenant les données de entity
et entity2
.
Il est important de noter que les champs utilisés dans les types anonymes doivent être compatibles, ce qui signifie qu'ils doivent être du même type, et si l'un ou l'autre des champs est nullable, il doit l'être. Si les champs sont incompatibles, une exception est levée.
Bien que cette approche fonctionne pour une équijointure, il est possible d'effectuer des jointures plus complexes en utilisant un comparateur d'égalité personnalisé ou en utilisant des clauses de jointure supplémentaires. Par exemple, le code suivant effectue une non-équijointure sur les tables entity
et entity2
à l'aide d'un comparateur d'égalité personnalisé :
<code class="language-csharp">var result = from x in entity join y in entity2 on new { x.field1, x.field2 } equals new { y.field1, y.field2 } into gj from y in gj.DefaultIfEmpty() where y == null || y.field3 == x.field4 select new { x, y }; // 选择结果</code>
Dans cet exemple, un comparateur d'égalité personnalisé est utilisé pour comparer les valeurs des champs field3
et field4
. Si les valeurs ne sont pas égales, la jointure sera quand même effectuée, mais la valeur de y
sera nulle.
En apprenant à utiliser les types anonymes et les comparateurs d'égalité personnalisés, vous pouvez utiliser LINQ pour effectuer diverses jointures, y compris des jointures sur plusieurs champs. N'oubliez pas de sélectionner Résultat final pour obtenir les données concaténées.
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!