Wie führe ich eine linke äußere Verknüpfung in C # LINQ mit Objekten ohne Verwendung von join-on-equals-into
Klauseln durch? Gibt es eine Möglichkeit, dies mit where
Klausel zu tun ? Richtiges Problem: Die innere Verbindung ist einfach und ich habe eine Lösung wie diese
List<JoinPair> innerFinal = (from l in lefts from r in rights where l.Key == r.Key
select new JoinPair { LeftId = l.Id, RightId = r.Id})
aber für die linke äußere Verbindung brauche ich eine Lösung. Meins ist so etwas, aber es funktioniert nicht
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
})
wo JoinPair eine Klasse ist:
public class JoinPair { long leftId; long rightId; }
Antworten:
Wie angegeben auf:
101 LINQ-Beispiele - Linke äußere Verbindung
quelle
Wenn ein datenbankgesteuerter LINQ-Anbieter verwendet wird, kann ein wesentlich besser lesbarer linker Outer Join als solcher geschrieben werden:
Wenn Sie das weglassen
DefaultIfEmpty()
, haben Sie eine innere Verbindung.Nehmen Sie die akzeptierte Antwort:
Diese Syntax ist sehr verwirrend und es ist nicht klar, wie sie funktioniert, wenn Sie MULTIPLE-Tabellen links verknüpfen möchten.
Hinweis
Es sollte beachtet werden, dass dies
from alias in Repo.whatever.Where(condition).DefaultIfEmpty()
dasselbe ist wie ein Outer-Apply / Left-Join-Lateral, das jeder (anständige) Datenbankoptimierer perfekt in einen Left-Join übersetzen kann, solange Sie nicht pro Zeile einführen -Werte (auch bekannt als tatsächliche äußere Anwendung). Tun Sie dies nicht in Linq-2-Objects (da es keinen DB-Optimierer gibt, wenn Sie Linq-to-Objects verwenden).Detailliertes Beispiel
Bei Verwendung mit LINQ 2 SQL lässt sich dies gut in die folgende gut lesbare SQL-Abfrage übersetzen:
Bearbeiten:
Ein komplexeres Beispiel finden Sie unter " Konvertieren der SQL Server-Abfrage in eine Linq-Abfrage ".
Wenn Sie dies in Linq-2-Objects (anstelle von Linq-2-SQL) tun, sollten Sie dies auf die altmodische Weise tun (da LINQ to SQL dies korrekt übersetzt, um Operationen zu verbinden, jedoch über Objekte dieser Methode erzwingt einen vollständigen Scan und nutzt die Indexsuche nicht aus, warum auch immer ...):
quelle
join
ist viel lesbarer und klarer als einewhere
gefolgt vonDefaultIfEmpty
Verwenden des Lambda-Ausdrucks
quelle
Enumerable.Empty<Product>.DefaultIfEmpty()
eine IEnumerable mit einem einzelnen Wert von zurückgegeben wirddefault(Product)
.Jetzt als Erweiterungsmethode:
Verwenden Sie, wie Sie normalerweise join verwenden würden:
Hoffe das spart dir etwas Zeit.
quelle
Schauen Sie sich dieses Beispiel an . Diese Abfrage sollte funktionieren:
quelle
r
in der select-Klausel nach Verwendung eines Joins auf zugegriffen werden?r
in der zweitenfrom
Klausel wiederverwenden . dhfrom r in lrs.DefaultIfEmpty()
Andernfalls ist diese Abfrage nicht sehr sinnvoll und wird wahrscheinlich nicht kompiliertr
, da der Kontext für die Auswahl nicht stimmt .Clockwise
mit John Cleese, lol.Eine Implementierung von Left Outer Join durch Erweiterungsmethoden könnte so aussehen
Die Ergebnisauswahl muss sich dann um die Nullelemente kümmern. Fx.
quelle
Schauen Sie sich dieses Beispiel an
Jetzt können Sie
include elements from the left
auch wenn dieses Elementhas no matches in the right
, in unserem Fall haben wir zurückgerufenArlene
wenn er keine Übereinstimmung im Recht hatHier ist die Referenz
Gewusst wie: Ausführen linker äußerer Verknüpfungen (C # -Programmierhandbuch)
quelle
Dies ist die allgemeine Form (wie bereits in anderen Antworten angegeben)
Hier ist jedoch eine Erklärung, von der ich hoffe, dass sie klarstellt, was dies tatsächlich bedeutet!
erstellt im Wesentlichen eine separate Ergebnismenge b_temp, die effektiv Null-Zeilen für Einträge auf der rechten Seite enthält (Einträge in 'b').
Dann die nächste Zeile:
..iteriert über diese Ergebnismenge, setzt den Standard-Nullwert für die 'Zeile' auf der rechten Seite und setzt das Ergebnis der Zeilenverknüpfung auf der rechten Seite auf den Wert von 'b_value' (dh den Wert auf der rechten Seite) Seite, wenn es einen passenden Datensatz gibt, oder 'null', wenn es keinen gibt).
Wenn die rechte Seite das Ergebnis einer separaten LINQ-Abfrage ist, besteht sie aus anonymen Typen, die nur entweder "etwas" oder "null" sein können. Wenn es sich jedoch um eine Aufzählung handelt (z. B. eine Liste - wobei MyObjectB eine Klasse mit 2 Feldern ist), können Sie genau angeben, welche Standardwerte für die Eigenschaften verwendet werden sollen:
Dadurch wird sichergestellt, dass 'b' selbst nicht null ist (seine Eigenschaften können jedoch unter Verwendung der von Ihnen angegebenen Standard-Nullwerte null sein). Auf diese Weise können Sie die Eigenschaften von b_value überprüfen, ohne eine Nullreferenzausnahme für b_value zu erhalten. Beachten Sie, dass für eine nullfähige DateTime ein Typ von (DateTime?), Dh 'nullable DateTime', als 'Typ' der Null in der Spezifikation für 'DefaultIfEmpty' angegeben werden muss (dies gilt auch für Typen, die nicht 'nativ' sind 'nullable zB double, float).
Sie können mehrere linke äußere Verknüpfungen ausführen, indem Sie einfach die obige Syntax verketten.
quelle
Hier ist ein Beispiel, wenn Sie mehr als 2 Tabellen verbinden müssen:
Ref: https://stackoverflow.com/a/17142392/2343
quelle
Erweiterungsmethode, die wie Left Join mit Join-Syntax funktioniert
habe es gerade in .NET Core geschrieben und es scheint wie erwartet zu funktionieren.
Kleiner Test:
quelle
Hier ist eine ziemlich einfach zu verstehende Version mit Methodensyntax:
quelle
Es gibt drei Tabellen: Personen, Schulen und Personenschulen, die Personen mit den Schulen verbinden, in denen sie studieren. In der Tabelle person_schools fehlt ein Verweis auf die Person mit id = 6. Die Person mit id = 6 wird jedoch im Ergebnis-Lef-Join-Raster dargestellt.
quelle
Dies ist eine SQL-Syntax im Vergleich zur LINQ-Syntax für innere und linke äußere Verknüpfungen. Linke äußere Verbindung:
http://www.ozkary.com/2011/07/linq-to-entity-inner-and-left-joins.html
"Im folgenden Beispiel wird eine Gruppenverknüpfung zwischen Produkt und Kategorie durchgeführt. Dies ist im Wesentlichen die linke Verknüpfung. Der Ausdruck into gibt Daten zurück, auch wenn die Kategorietabelle leer ist. Um auf die Eigenschaften der Kategorietabelle zugreifen zu können, müssen wir jetzt aus dem aufzählbaren Ergebnis auswählen durch Hinzufügen der from cl-Anweisung in catList.DefaultIfEmpty ().
quelle
Führen Sie linke äußere Verknüpfungen in linq C # aus. // Führen Sie linke äußere Verknüpfungen durch
https://dotnetwithhamid.blogspot.in/
quelle
Ich möchte hinzufügen, dass wenn Sie die MoreLinq-Erweiterung erhalten, jetzt sowohl homogene als auch heterogene Linksverknüpfungen unterstützt werden
http://morelinq.github.io/2.8/ref/api/html/Overload_MoreLinq_MoreEnumerable_LeftJoin.htm
Beispiel:
BEARBEITEN:
Im Nachhinein mag dies funktionieren, aber es konvertiert die IQueryable in eine IEnumerable, da morelinq die Abfrage nicht in SQL konvertiert.
Sie können stattdessen einen GroupJoin wie hier beschrieben verwenden: https://stackoverflow.com/a/24273804/4251433
Dadurch wird sichergestellt, dass es als IQueryable verbleibt, falls Sie später weitere logische Operationen ausführen müssen.
quelle
Der einfache Weg ist die Verwendung des Schlüsselworts Let. Das funktioniert bei mir.
Dies ist eine Simulation von Left Join. Wenn nicht jedes Element in der Tabelle B mit dem Element A übereinstimmt, gibt BItem null zurück
quelle
Wenn Sie etwas beitreten und filtern müssen, kann dies außerhalb des Joins erfolgen. Der Filter kann nach dem Erstellen der Sammlung durchgeführt werden.
In diesem Fall reduziere ich die zurückgegebenen Zeilen, wenn ich dies in der Join-Bedingung mache.
Ternäre Bedingung wird verwendet
(= n == null ? "__" : n.MonDayNote,)
Wenn das Objekt ist
null
(also keine Übereinstimmung), geben Sie zurück, was nach dem steht?
.__
, in diesem Fall.Andernfalls geben Sie zurück, was nach dem
:
,n.MonDayNote
.Dank der anderen Mitwirkenden habe ich dort mit meiner eigenen Ausgabe begonnen.
quelle
AUSGABE
quelle
Nach meiner Antwort auf eine ähnliche Frage hier:
Linq to SQL linker äußerer Join mit Lambda-Syntax und Joining auf 2 Spalten (zusammengesetzter Join-Schlüssel)
Holen Sie sich den Code hier oder klonen Sie mein Github-Repo und spielen Sie!
Abfrage:
Lambda:
quelle
Übersicht: In diesem Codeausschnitt zeige ich, wie nach ID gruppiert wird, wobei Tabelle1 und Tabelle2 eine Eins-zu-Viele-Beziehung haben. Ich gruppiere auf Id, Field1 und Field2. Die Unterabfrage ist hilfreich, wenn eine dritte Tabellensuche erforderlich ist und eine Linksverknüpfungsbeziehung erforderlich gewesen wäre. Ich zeige eine Linksverknüpfungsgruppierung und eine Unterabfrage linq. Die Ergebnisse sind gleichwertig.
quelle
quelle
Einfache Lösung für den LEFT OUTER JOIN :
Anmerkungen :
quelle
setA
undsetB
in der Antwort zurückgeben.