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