2012-04-10 11 views
6

Ich stieß auf folgenden Code und weiß nicht, was hat von zweimal in diesem Code bedeuten. Bedeutet es eine Verbindung zwischen Büchern und CSBooks?ist die Verwendung von "von" mehr als einmal gleichzusetzen?

List<Product> Books = new List<Product>(); 
      List<Product> CSBooks = new List<Product>(); 
      var AllBooks = from Bk in Books 
          from CsBk in CSBooks 
          where Bk != CsBk 
          select new[] { Bk, CsBk }; 

Antwort

13

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.

3

from zweimal ist das Kreuzprodukt. Das sind alle Kombinationen von Books und CSBooks

2

Es ist eher wie das Gegenteil von einem Join. Ich denke, das Ergebnis wäre ein kartesisches Produkt. Das heißt, aufgrund der != wird jedes Element der ersten Menge an jedem Element der zweiten Menge, die nicht gleich dem ersten Element ist, verbunden.

Verwandte Themen