Heim >Backend-Entwicklung >C++ >Wie kann ich einen linken äußeren Join in Linq durchführen, ohne 'Join-on-Equals-into' -Anklauseln zu verwenden?

Wie kann ich einen linken äußeren Join in Linq durchführen, ohne 'Join-on-Equals-into' -Anklauseln zu verwenden?

Linda Hamilton
Linda HamiltonOriginal
2025-02-02 14:21:08975Durchsuche

How Can I Perform a Left Outer Join in LINQ Without Using `join-on-equals-into` Clauses?

c# Linq linke Außenverbindungen: Eine Alternative zu join-on-equals-into

Implementieren eines linken äußeren Join in LINQ ohne Standard join-on-equals-into -Syntax kann eine Herausforderung sein. Während innere Anschlüsse unkomplizierte Implementierungen haben, erfordern die linken äußeren Verbindungen eine andere Strategie. Erforschen wir ein gemeinsames Missverständnis und dann den richtigen Ansatz.

Ein fehlerhafter Versuch:

Ein häufiges, aber falscher Ansatz versucht, eine bedingte Zuordnung innerhalb der select -Klausel zu verwenden, um einen linken äußeren Join nachzuahmen:

<code class="language-csharp">// Incorrect approach
List<JoinPair> leftFinal = (from l in lefts
                             from r in rights
                             select new JoinPair { 
                                            LeftId = l.Id, 
                                            RightId = (l.Key == r.Key) ? r.Id : 0 
                                        });</code>

Diese Methode kann einen linken äußeren Join nicht genau repräsentieren, da sie mehrere Einträge für Elemente der linken Seite mit mehreren passenden rechten Elementen erzeugt und keine Fälle korrekt behandelt, in denen keine Übereinstimmungen auf der rechten Seite für eine bei der linken Seite.

Die richtige Methode mit DefaultIfEmpty():

Der empfohlene Ansatz nutzt die Methode DefaultIfEmpty(). Diese Methode übernimmt das Fehlen von passenden rechten Elementen.

Hier erfahren Sie, wie Sie einen linken äußeren Join effektiv durchführen:

<code class="language-csharp">var q =
    from l in lefts
    join r in rights on l.Key equals r.Key into ps_jointable
    from p in ps_jointable.DefaultIfEmpty()
    select new { LeftId = l.Id, RightId = p?.Id ?? 0 };</code>

Dieser Code führt zunächst einen Gruppe Join (into ps_jointable) aus. DefaultIfEmpty() stellt dann sicher, dass ps_jointable leer ist (keine Übereinstimmungen rechts), es immer noch ein einzelnes Element ermöglicht, sodass die nachfolgende select -Klausel jedes links-Seite-Element verarbeiten kann. Der Null-Conditional Operator (?.) und der Null-Koalescing-Operator (??) verarbeiten sicher den potenziellen null -Werwert von p.Id, der 0 als Standard zugewiesen wird, wenn keine Übereinstimmung gefunden wird. Dies spiegelt genau das Verhalten einer linken äußeren Verbindung wider.

Das obige ist der detaillierte Inhalt vonWie kann ich einen linken äußeren Join in Linq durchführen, ohne 'Join-on-Equals-into' -Anklauseln zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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