6

私は次のコードに出くわしましたが、このコードで2回から何を意味するのかわかりません。BooksとCSBooksの間に結合があるということですか?

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 };
4

3 に答える 3

13

それは結合のようなものです。あなたが言う時:

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

于 2012-04-10T20:25:15.740 に答える
3

from2回は外積です。Booksそれはとのすべての組み合わせですCSBooks

于 2012-04-10T20:10:13.350 に答える
2

結合の反対のようなものです。その結果、実際にはデカルト積になると思います。つまり、のために!=、最初の要素と等しくない2番目のセットの各要素で最初のセットの各要素を結合します。

于 2012-04-10T20:10:47.380 に答える