Dies ist die allgemeine Form (wie bereits in anderen Antworten angegeben)
var c =
from a in alpha
join b in beta on b.field1 equals a.field1 into b_temp
from b_value in b_temp.DefaultIfEmpty()
select new { Alpha = a, Beta = b_value };
Hier ist jedoch eine Erklärung, die hoffentlich klarstellt, was das eigentlich bedeutet!
join b in beta on b.field1 equals a.field1 into b_temp
erzeugt im Wesentlichen eine separate Ergebnismenge b_temp, die effektiv Null-"Zeilen" für Einträge auf der rechten Seite (Einträge in "b") enthält.
Dann die nächste Zeile:
from b_value in b_temp.DefaultIfEmpty()
durchläuft diese Ergebnismenge, setzt den Standardwert Null für die "Zeile" auf der rechten Seite und setzt das Ergebnis der rechten Zeilenverknüpfung auf den Wert von "b_value" (d. h. den Wert auf der rechten Seite, wenn es einen übereinstimmenden Datensatz gibt, oder "Null", wenn es keinen gibt).
Wenn nun 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), dann ist es möglich, genau festzulegen, welche Standard-Nullwerte für die Eigenschaften verwendet werden:
var c =
from a in alpha
join b in beta on b.field1 equals a.field1 into b_temp
from b_value in b_temp.DefaultIfEmpty( new MyObjectB { Field1 = String.Empty, Field2 = (DateTime?) null })
select new { Alpha = a, Beta_field1 = b_value.Field1, Beta_field2 = b_value.Field2 };
Dies stellt sicher, dass 'b' selbst nicht null ist (aber seine Eigenschaften können null sein, unter Verwendung der Standard-Nullwerte, die Sie angegeben haben), und dies ermöglicht Ihnen, Eigenschaften von b_value zu überprüfen, ohne eine Null-Referenz-Ausnahme für b_value zu erhalten. Beachten Sie, dass für eine nullable DateTime ein Typ von (DateTime?) d.h. 'nullable DateTime' als 'Type' der Null in der Spezifikation für 'DefaultIfEmpty' angegeben werden muss (dies gilt auch für Typen, die nicht 'nativ' nullable sind, z.B. double, float).
Sie können mehrere Left Outer Joins durchführen, indem Sie die obige Syntax einfach aneinanderreihen.
3 Stimmen
Können Sie ein Beispiel dafür geben, was Sie zu erreichen versuchen?
0 Stimmen
Normale linke äußere Verknüpfung ist so etwas wie dieses: var a = from b in bb join c in cc on b.bbbbb equals c.ccccc into dd from d in dd.DefaultIfEmpty() select b.sss; Meine Frage ist es eine Möglichkeit zu tun, dass ohne Verwendung von join-on-equals-into-Klauseln etwas wie dieses var a = from b in bb from c in cc where b.bbb == c.cccc ... und so weiter...
2 Stimmen
Sicher gibt es, aber Sie sollten ein Beispiel für Ihren Code posten, den Sie bereits haben, damit die Leute Ihnen eine bessere Antwort geben können
1 Stimmen
Ich suchte nach einem "Links ohne " JOIN (und ich habe es mit dem Begriff "OUTER" verwechselt). Diese Antwort entsprach eher dem, was ich wollte.
0 Stimmen
Ähnlicher Beitrag - Linq join iquery, wie man defaultifempty verwendet
0 Stimmen
Siehe auch Linq to Entities join vs. groupjoin .
0 Stimmen
Für Linq-to-Entities (nicht Objects), siehe diese Frage: stackoverflow.com/questions/19356439/