„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Detaillierte Erläuterung der Betriebsmethode von LINQ Voller externer Anschluss

Detaillierte Erläuterung der Betriebsmethode von LINQ Voller externer Anschluss

Gepostet am 2025-03-13
Durchsuche:976

How to Perform a Full Outer Join in LINQ?

linq - Vollständige externe Verbindung

Frage:

So führen Sie eine vollständige Verbindung zwischen zwei Objektlisten basierend auf den gemeinsamen Schlüsselfeldern aus, um sicherzustellen, dass alle Datensätze in beiden Listen im Ergebnis enthalten sind, auch wenn sie nicht entsprechende Übereinstimmungen in der anderen Liste haben?

Antwort:

1.

Um eine vollständige externe Verbindung in LINQ zu implementieren, können wir eine benutzerdefinierte Erweiterungsmethode wie folgt definieren:

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.

In dem angegebenen Beispiel haben wir zwei Listen:

firstnames

und lastnames . Um eine vollständige externe Verbindung durchzuführen, können wir den folgenden Code verwenden:

var outerjoin = von First in FirstNames Machen Sie Last in LastNames bei auf First.id gleich letztes.id in Temperatur von letztem in temp.defaultifeMpty () Wählen Sie neu { id = zuerst! = null? FirstName = First! = NULL? Incident = Last! = 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
                };
Dieser Code verwendet einen linken äußeren Join, wobei jedes Datensatz in

FirstNames

mit dem ersten Matching -Datensatz in

Lastnames verbunden ist und verbindet sich mit dem Standardwert, wenn keine Übereinstimmung gefunden wird. Die in temp erstellt eine temporäre Sammlung von passenden Datensätzen in lastnames , in der wir defaultIfeMpty () anwenden können, um sicherzustellen, dass Mismatch -Datensätze enthalten sind. Dies implementiert tatsächlich eine linke äußere Verbindung, keine vollständige äußere Verbindung im vollständigen Sinne. Um eine vollständige externe Verbindung zu erreichen, müssen Sie die oben angepasste Erweiterungsmethode Fuluterjoin verwenden. 4. Die erwartete Ausgabe für eine vollständig externe Verbindung lautet:

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

ID  FirstName  LastName
--  ---------  --------
1   John       Doe
2   Sue        
3             Smith
für den nicht übereinstimmenden Namen und eine negative Ganzzahl für die nicht übereinstimmende ID an.

6.

Die Laufzeit der vollständig externen Verbindung ist o (n m), wobei n und m die Längen der beiden Eingabelisten sind. Dies liegt daran, dass die Operation tolookup () o (n) Zeit nimmt, und nachfolgende Operationen erfordern o (n m) Zeit.

7.

Diese Implementierung einer vollständig externen Verbindung ist derzeit nicht Teil des LINQ -Standards, es wurde jedoch empfohlen, sie in zukünftige Versionen aufzunehmen. Standard LINQ unterstützt keine vollständigen externen Verbindungen und benötigt eine benutzerdefinierte Erweiterungsmethode, um sie zu implementieren.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3