Maison >développement back-end >C++ >Comment effectuer une jointure extérieure complète dans Linq?
Linq -Unter Connexion extérieure
Comment effectuer une connexion complète entre les deux objets en fonction du champ de clé publique pour s'assurer que tous les enregistrements des deux listes sont inclus dans les résultats.
Réponse:
1. Méthode d'extension personnalisée connectée à l'ensemble à l'extérieur
Afin d'obtenir une connexion extérieure dans LINQ, nous pouvons définir une méthode d'extension personnalisée, comme indiqué ci-dessous:2. Implémentez
Dans l'exemple fourni, nous avons deux listes:<code class="language-csharp">public static IEnumerable<TResult> FullOuterJoin<TA, TB, TKey, TResult>( this IEnumerable<TA> a, IEnumerable<TB> b, Func<TA, TKey> selectKeyA, Func<TB, TKey> selectKeyB, Func<TA, TB, TKey, TResult> projection, TA defaultA = default(TA), TB defaultB = default(TB), IEqualityComparer<TKey> cmp = null) { cmp = cmp ?? EqualityComparer<TKey>.Default; var alookup = a.ToLookup(selectKeyA, cmp); var blookup = b.ToLookup(selectKeyB, cmp); var keys = new HashSet<TKey>(alookup.Select(p => p.Key), cmp); keys.UnionWith(blookup.Select(p => p.Key)); var join = from key in keys from xa in alookup[key].DefaultIfEmpty(defaultA) from xb in blookup[key].DefaultIfEmpty(defaultB) select projection(xa, xb, key); return join; }</code>et
firstNames
3. Explication
lastNames
Ce code utilise une connexion extérieure gauche, et chaque enregistrement dans
<code class="language-csharp">var outerJoin = from first in firstNames join last in lastNames on first.ID equals last.ID into temp from last in temp.DefaultIfEmpty() select new { id = first != null ? first.ID : last.ID, firstname = first != null ? first.Name : string.Empty, surname = last != null ? last.Name : string.Empty };</code>.
pour garantir qu'il contient des enregistrements sans satiss. Cela réalise en fait la connexion externe gauche, pas une connexion complète dans le sens complet. Pour obtenir une connexion extérieure, vous devez utiliser la méthode d'expansion personnalisée ci-dessus. firstNames
lastNames
4. attendre la sortie into temp
lastNames
La sortie attendue de la connexion externe est: DefaultIfEmpty()
FullOuterJoin
pour le nom insatisfaisant, et nous spécifions l'entier négatif pour l'ID non-correspondant.
<code>ID FirstName LastName -- --------- -------- 1 John Doe 2 Sue 3 Smith</code>6. Précautions de performance
nécessite du temps O (n), et les opérations suivantes nécessitent du temps O (n m). string.Empty
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!