2009-07-14 19 views
34

私はいつも==演算子を使用するのではなく、linq結合でequalsというキーワードがあるのか​​どうか疑問に思っていました。Linq:結合で==と等号の違いは何ですか?

Property deadline = 
(from p in properties 
join w in widgets 
    on p.WidgetID equals w.ID 
select p).First(); 

代わりの

Property deadline = 
(from p in properties 
join w in widgets 
    on p.WidgetID == w.ID 
select p).First(); 

[EDIT]は、質問を言い換えと例を改訂。

答えて

38

The Mothでマット・ウォーレンの素敵な説明があります:

「C#は言葉を持っている理由は 『==』演算子は、それが明確な句のニーズ 『オン』ことを作ることだったの代わりに 『等しいです』 from-joinパターンは、比較可能な値を計算するために使用される2つの別個のデリゲートを指定するEnumerable.Join()標準クエリ演算子にマップされます。 1つのルックアップ・テーブルを作成し、ルックアップ・テーブルにもう1つのプローブを組み込むために、別々のデリゲートとしてそれらを必要とします。SQLのような完全なクエリ・プロセッサは、単一の述語式を調べて、それを処理しようとしています。しかし、LINQは、SQLと同様に動作させるために結合条件は、常に式ツリー、シンプルなメモリ内のオブジェクトの場合のための大きなオーバーヘッドとして指定することを必要とするであろう。」

しかし、これはjoinに関するものである。私は」 equalsが(それもコンパイルしない?)あなたのコード例で使用されるべきである分からない。

+1

あなたはそうです、それはコンパイルされません、私の悪い!私は==と等号で問題が発生してからしばらくしていましたが、間違って==を使用したときにそれが結合であったと思います。とにかく説明をありがとう! –

15

あなたの最初のバージョンはコンパイルされません。と等価結合の別々の半分を明確にする加入であなたのみ使用equals、コンパイラ。

+0

はい...最初のものは問題ありません。 –

+0

ええ、申し訳ありません、私の悪い。問題を抱えてから(しばらくは参加していました)、私は誤ってequalsの代わりに==を置き、最初にequalsというキーワードがあるのが不思議でした。私はそれを覚えていませんでした;) –

+0

したがって、結合のケースでは、==を使用するのが正当なのでしょうか?常にequalsを使用する必要がありますか? –