それは結合のようなものです。あなたが言う時:
from customer in customers
join order in orders on customer.Id equals order.CustomerId
select whatever
これは本質的に、より効率的な書き方です。
from customer in customers
from order in orders
where customer.Id == order.CustomerId
select whatever
理由がわかりますか?1つ目は、「クエリプロセッサ、顧客と注文には、注文に保存されている顧客IDと顧客IDの同等性によって定義される特別な関係があります」と書かれています。2つ目は、「デカルト積(顧客と注文の可能なすべての組み合わせ)を提供してから、意味のないものを除外する」とだけ言っています。それらは同じ効果がありますが、前者の方が効率的です。
ただし、複数の「from」句を使用して、デカルト積だけではなく、より凝ったことを行うことができます。顧客が複数の住所を持つことができると仮定します。
from customer in customers
from address in customer.Addresses
select address
複数from
の句は実際には「多数選択」です。 つまり、シーケンスと、最初のシーケンスのすべてのアイテムからシーケンスを作成する方法を取り、結果のすべてのシーケンスをマージします。
「多数選択」は単純ですが、非常に強力です。「多数選択」を使用して(低速ですが正しい)結合操作を実行できることはすでに見てきました。実際、十分に賢く、多くの時間とメモリを浪費することを気にしないのであれば、selectmanyを使用してすべての可能なクエリを作成できます。例えば:
from customer in customers
where customer.City == "London"
select customer
このような「場所」なしで書くことができます:
from customer in customers
from c in (customer.City == "London" ?
new Customer[] {customer} :
new Customer[] { } )
select c;
あなたはそうすることに夢中になるでしょうが、実際にはwhere
不要です-それらは選択された多くを書くためのより速く、より短くそしてより効率的な方法です。join