Ich versuche, eine Abfrage in LINQ zu implementieren, die einen linken äußeren Join mit mehreren Bedingungen in der ON-Klausel verwendet.
Ich verwende das Beispiel der folgenden beiden Tabellen Project (ProjectID, ProjectName) und Task (TaskID, ProjectID, TaskName, Completed). Ich möchte die vollständige Liste aller Projekte mit ihren jeweiligen Aufgaben sehen, aber nur die Aufgaben, die abgeschlossen sind.
Ich kann keinen Filter für verwenden, Completed == true
da dadurch alle Projekte herausgefiltert werden, für die keine Aufgaben abgeschlossen wurden. Stattdessen möchte ich Completed == true
die ON-Klausel des Joins hinzufügen , damit die vollständige Liste der Projekte angezeigt wird, aber nur abgeschlossene Aufgaben angezeigt werden. Projekte ohne abgeschlossene Aufgaben zeigen eine einzelne Zeile mit einem Nullwert für Aufgabe an.
Hier ist die Grundlage der Abfrage.
from t1 in Projects
join t2 in Tasks
on new { t1.ProjectID} equals new { t2.ProjectID } into j1
from j2 in j1.DefaultIfEmpty()
select new { t1.ProjectName, t2.TaskName }
Wie füge ich && t2.Completed == true
der on-Klausel hinzu?
Ich kann anscheinend keine LINQ-Dokumentation dazu finden.
Antworten:
Sie müssen nur die anonyme Eigenschaft auf beiden Seiten gleich benennen
Basierend auf den Kommentaren von @svick ist hier eine weitere Implementierung, die sinnvoller sein könnte:
quelle
and
, nicht eine Gleichheit eines „seltsamen“ Objekts. Und um meinen Standpunkt zu beweisen, ist Ihr Code falsch. Damit es funktioniert, müssten Sietrue
auf der linken Seite undt2.Complete
auf der rechten Seite haben.AND SecondProperty IN (123, 456)
. Ich werde mich dieser Herausforderung stellen und jede Hilfe, die Sie geben könnten, wäre sehr dankbar.Hier geht's mit:
quelle
Das kannst du nicht so machen. Die
join
Klausel (und dieJoin()
Erweiterungsmethode) unterstützen nur Equijoins. Das ist auch der Grund, warum es verwendetequals
und nicht==
. Und selbst wenn Sie so etwas tun könnten, würde es nicht funktionieren, dajoin
es sich um eine innere Verknüpfung handelt, nicht um eine äußere Verknüpfung.quelle
Dies funktioniert gut für 2 Tabellen. Ich habe 3 Tabellen und die on-Klausel muss 2 Bedingungen aus 3 Tabellen verknüpfen. Mein Code:
from p in _dbContext.Products join pv in _dbContext.ProductVariants on p.ProduktId entspricht pv.ProduktId join jpr in leftJoinQuery on new {VariantId = pv.Vid, ProductId = p.ProduktId} entspricht new {VariantId = jpr.Pr ProductId = jpr.Prices.ProduktID} in lj
An dieser Stelle wird jedoch ein Fehler angezeigt: Join pv in _dbContext.ProductVariants auf p.ProduktId entspricht pv.ProduktId
Fehler: Der Typ eines der Ausdrücke in der Join-Klausel ist falsch. Die Typinferenz ist beim Aufruf von 'GroupJoin' fehlgeschlagen.
quelle