Left join in Linq?
Es gibt eine Menge von Fragen auf, SO dass bereits über Left-joins in Linq und die, die ich habe verwenden alle die join
Schlüsselwort für die Erreichung der gewünschten Ende.
Dies ist jedoch nicht sinnvoll für mich. Sagen wir, ich habe die Tabellen Customer
und Invoice
, verbunden durch eine foreign key - CustomerID
auf Invoice
. Jetzt möchte ich einen Bericht ausführen, mit Kunden-info, plus Rechnungen. SQL wäre:
select c.*, i.*
from Customer c
left join Invoice i on c.ID = i.CustomerID
Von dem, was ich gesehen habe, die Antworten SO, die Menschen sind meist darauf hindeutet:
var q = from c in Customers
join i in Invoices.DefaultIfEmpty() on c.ID equals i.CustomerID
select new { c, i };
Ich verstehe wirklich nicht, wie das sein kann die einzige Möglichkeit. Die Beziehung zwischen Customer
und Invoice
ist bereits definiert durch die LinqToSQL Klassen; warum sollte ich wiederhole es für die join
- Klausel? Wenn ich wollte ein inner join wäre es einfach gewesen:
var q = from c in Customers
from i in c.Invoices
select new { c, i };
ohne die Angabe der verknüpften Felder!
Habe ich versucht:
var q = from c in Customers
from i in c.Invoices.DefaultIfEmpty()
select new { c, i };
aber das gerade gab mir das gleiche Ergebnis, als ob es ein "inner join".
Gibt es nicht einen besseren Weg, dies zu tun?
InformationsquelleAutor Shaul Behr | 2009-07-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was redest du da? Dass
from i in c.Invoice.DefaultIfEmpty()
ist gerade ein left join.Dieser test produziert:
InformationsquelleAutor Amy B
Während die Beziehung ist bereits definiert (sowohl in der Datenbank und in der .dbml-markup) die Laufzeit nicht automatisch ermitteln kann, wenn Sie es verwenden sollten, die Beziehung.
Was ist, wenn es gibt zwei Beziehungen in Objekt-Modell (Person hat Eltern und Kinder, die beide Beziehungen zur anderen Person-Instanzen). Während Fälle spezielle Gehäuse, dies macht das system komplexer (also mehr bugs). Denken Sie daran, in SQL würden Sie wiederholen Sie die Spezifikation der Beziehung.
Erinnern Indizes und Schlüssel sind ein Implementierungsdetail und kein Teil der relationalen algebra zugrunde liegt, dass die relation-Modell.
Wenn Sie möchten, eine LINKE ÄUßERE VERKNÜPFUNG, dann müssen Sie die Verwendung von "
into
":und WR haben Typ
IEnumerable<Invoivce>
mit eventuell keine Instanzen.Dann tun Sie so, nur c benutzen.Rechnungen im Ausdruck. Wenn Sie einen anderen Bezeichner verwenden Sie dann eine let-Klausel.
InformationsquelleAutor Richard
Können Sie wahrscheinlich wollen, verwenden Sie die " in " - Schlüsselwort.
Beispiel
InformationsquelleAutor emvy