Es ist so etwas wie ein Join. Wenn Sie sagen:
from customer in customers
join order in orders on customer.Id equals order.CustomerId
select whatever
, die im Wesentlichen eine effizientere Art und Weise des Schreibens ist:
from customer in customers
from order in orders
where customer.Id == order.CustomerId
select whatever
Siehst du, warum? Der erste sagt "hey Query Processor, Kunden und Bestellungen haben eine besondere Beziehung, die durch die Gleichheit der Kunden-ID und der Kundennummer in einer Bestellung definiert ist". Der zweite sagt nur "gib mir das kartesische Produkt - alle möglichen Kombinationen von Kunden und Bestellungen - und dann füge diejenigen heraus, die keinen Sinn ergeben". Sie haben den gleichen Effekt, aber ersteres ist effizienter.
Sie können jedoch mehrere "von" -Klauseln verwenden, um Dinge zu tun, die ausgefallener sind als nur kartesische Produkte. Angenommen, ein Kunde kann mehr als eine Adresse haben:
from customer in customers
from address in customer.Addresses
select address
Multiple from
Klauseln sind eigentlich ein „viele wählen“. Das heißt, sie nehmen eine Sequenz und eine Möglichkeit, Sequenzen aus jedem Element der ersten Sequenz, und die zusammenführen alle resultierenden Sequenzen zusammen.
Das "select many" ist einfach aber extrem leistungsstark; Wir haben bereits gesehen, dass Sie eine "select many" verwenden können, um eine (langsame, aber korrekte) Join-Operation durchzuführen. In der Tat können Sie wählen Sie viele, um jede mögliche Abfrage machen, wenn Sie ausreichend clever sind und nicht viel Zeit und Arbeitsspeicher verschwenden. Zum Beispiel:
from customer in customers
from c in (customer.City == "London" ?
new Customer[] {customer} :
new Customer[] { })
select c;
würden Sie verrückt sein, dies zu tun, aber where
und join
sind eigentlich unnötige - sie sind einfach:
from customer in customers
where customer.City == "London"
select customer
konnte ohne „where“ wie diese geschrieben werden schnellere, kürzere und effizientere Möglichkeiten zum Schreiben von vielen.