"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Explication détaillée de la méthode de fonctionnement de la connexion externe complète LINQ

Explication détaillée de la méthode de fonctionnement de la connexion externe complète LINQ

Publié le 2025-03-13
Parcourir:545

How to Perform a Full Outer Join in LINQ?

linq - connexion externe complète

question:

Comment effectuer une connexion complète entre deux listes d'objets en fonction des champs clés communs, en s'assurant que tous les enregistrements dans les deux listes sont inclus dans le résultat, même s'ils n'ont pas de correspondances correspondantes dans l'autre liste?

Répondre:

1.

Afin d'implémenter une connexion externe complète dans linq, nous pouvons définir une méthode d'extension personnalisée comme suit:

public static IEnumerable FullOuterJoin(
    this IEnumerable a,
    IEnumerable b,
    Func selectKeyA,
    Func selectKeyB,
    Func projection,
    TA defaultA = default(TA),
    TB defaultB = default(TB),
    IEqualityComparer cmp = null)
{
    cmp = cmp ?? EqualityComparer.Default;
    var alookup = a.ToLookup(selectKeyA, cmp);
    var blookup = b.ToLookup(selectKeyB, cmp);

    var keys = new HashSet(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;
}
2.

Dans l'exemple fourni, nous avons deux listes:

firstNames

et lastNames . Pour effectuer une connexion externe complète, nous pouvons utiliser le code suivant:

var exterjoin = de First in FirstName Rejoignez le dernier dans LastName sur First.id équivaut à Last.id en température Du dernier dans Temp.DefaulfEmpty () sélectionner nouveau { id = d'abord! = null? FirstName = First! = Null? incident = dernier! = null? };
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
                };
Ce code utilise une jointure extérieure gauche, où chaque enregistrement dans

firstNames

est connecté au premier enregistrement correspondant dans

lastNames et se connecte à la valeur par défaut si aucune correspondance n'est trouvée. L'instruction en température crée une collection temporaire d'enregistrements correspondants dans lastNames , nous permettant d'appliquer defaulfempty () pour garantir que des enregistrements de non-affection sont inclus. Cela implémente en fait une connexion extérieure gauche, pas une connexion extérieure complète au sens complet. Pour obtenir une connexion externe complète, vous devez utiliser la méthode d'extension fullouterjoin personnalisée ci-dessus. 4. La sortie attendue pour une connexion entièrement externe est:

id FirstName LastName - ------------------- 1 John Doe 2 Sue 3 Smith

ID  FirstName  LastName
--  ---------  --------
1   John       Doe
2   Sue        
3             Smith
pour le nom incompatible et un entier négatif pour l'ID non apparenté.

6.

Le temps d'exécution de la connexion entièrement externe est o (n m), où n et m sont les longueurs des deux listes d'entrée. En effet 7.

Cette implémentation d'une connexion entièrement externe ne fait actuellement pas partie de la norme LINQ, mais il a été recommandé de l'inclure dans les futures versions. Linq standard ne prend pas directement en charge les connexions externes complètes et nécessite une méthode d'extension personnalisée pour l'implémenter.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3