2012-04-10 1 views
6

私は次のコードに出くわしました。このコードではからまでの2倍の意味が分かりません。書籍とCSBookの間に参加があることを意味しますか?"from"を複数回使用するのは、参加するのと同じですか?

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

答えて

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条項実際に「多くの選択」です:顧客が複数のアドレスを持つことができると仮定します。 、それらはシーケンスを取るさ、及び第一の配列のすべてのアイテムからの配列を製造する方法、及びが一緒すべての結果のシーケンスをマージします。

"select many"はシンプルですが非常に強力です。私たちは既に、「選択した多くの」を使って(遅いが正しい)結合操作を行うことができることを見てきました。実際には、あなたは十分に巧妙であり、時間と多くのメモリを無駄に気にしない場合は、すべての可能なクエリを作るために多くを選択することができます。例えば: - 彼らはある

from customer in customers 
from c in (customer.City == "London" ? 
       new Customer[] {customer} : 
       new Customer[] { }) 
select c; 

あなたがそうすることを夢中になるだろうが、wherejoinが実際に不要です:

from customer in customers 
where customer.City == "London" 
select customer 

は、「どこで」、このようにせずに書くことができます選択した多くのものを書くより速く、短く、より効率的な方法です。

3

from 2度はクロス積である。これはすべてBooksCSBooksの組み合わせです。

2

これは、結合とは逆です。私はそれが実際にデカルト積であると考えています。つまり、!=のために、最初の要素と等しくない2番目の要素の各要素の最初の要素の各要素を結合します。

関連する問題