Heim > Backend-Entwicklung > C++ > Wie führe ich einen vollständigen Outer -Join in Linq aus?

Wie führe ich einen vollständigen Outer -Join in Linq aus?

Patricia Arquette
Freigeben: 2025-01-31 17:21:13
Original
747 Leute haben es durchsucht

How to Perform a Full Outer Join in LINQ?

linq -OUTER OUTER VERBINDUNG

<:> Frage:

Wie können Sie eine vollständige Konzeption zwischen den beiden Objekten basierend auf dem Feld der öffentlichen Schlüssel durchführen, um sicherzustellen, dass alle Aufzeichnungen der beiden Listen in den Ergebnissen enthalten sind.

Antwort:

1. benutzerdefinierte Erweiterungsmethode, die mit dem gesamten Außenbereich verbunden ist

Um eine äußere Verbindung in LINQ zu erreichen, können wir eine benutzerdefinierte Erweiterungsmethode definieren, wie unten gezeigt:

2. implementieren

In dem angegebenen Beispiel haben wir zwei Listen:
<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>
Nach dem Login kopieren
und

. Um die äußere Verbindung auszuführen, können wir den folgenden Code verwenden:

firstNames 3. Erläuterung lastNames Dieser Code verwendet eine linke Außenverbindung, und jeder Datensatz in

ist mit dem ersten Übereinstimmungsdatensatz in
<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>
Nach dem Login kopieren
verbunden.

Die Anweisung erstellt eine vorübergehende Sammlung von

-Abschnittsätzen, mit der wir

anwenden können, um sicherzustellen, dass sie nicht satisierende Datensätze enthält. Dies erkennt tatsächlich die linke externe Verbindung, nicht eine vollständige Verknüpfung im gesamten Sinne. Um eine äußere Verbindung zu erreichen, müssen Sie die oben angepasste firstNames -Expansionsmethode verwenden. lastNames into temp 4. Erwarten Sie Ausgabe lastNames DefaultIfEmpty() Die erwartete Ausgabe der äußeren Verbindung ist: FullOuterJoin

5. Der definierte Standardwert

Mit der Erweiterungsmethode können Sie den Standardwert für unbefriedigende Datensätze angeben. Im Beispiel geben wir

für den unbefriedigenden Namen an und geben die negative Ganzzahl für die nicht vergleichende ID an.
<code>ID  FirstName  LastName
--  ---------  --------
1   John       Doe
2   Sue        
3             Smith</code>
Nach dem Login kopieren

6. Leistungsvorkehrungen

Die Laufzeit der gesamten externen Verbindung ist O (n m), wobei n und m die Länge der beiden Eingangslisten sind. Dies liegt daran, dass der Betrieb von string.Empty o (n) Zeit und nachfolgende Operationen o (n m) Zeit erfordern.

7. LINQ -Implementierung

Diese Implementierung der gesamten äußeren Verbindung ist derzeit nicht Teil des LINQ -Standards, wird jedoch empfohlen, sie in die zukünftige Version einzubeziehen. Standard LINQ unterstützt die äußere Verbindung nicht direkt und muss angepasst werden, um sie zu erreichen. ToLookup()

Das obige ist der detaillierte Inhalt vonWie führe ich einen vollständigen Outer -Join in Linq aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage