Linq: В чем разница между == и равно в соединении? - PullRequest
36 голосов
/ 14 июля 2009

Мне всегда было интересно, почему в соединениях linq есть ключевое слово equals, а не оператор ==.

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] Перефразировал вопрос и пересмотрел примеры.

Ответы [ 2 ]

41 голосов
/ 14 июля 2009

Есть хорошее объяснение Мэтта Уоррена в Моль :

"Причина, по которой в C # вместо оператора" == "используется слово" равно ", заключается в том, чтобы пояснить, что для предложения" on "необходимо указать два отдельных выражения, которые сравниваются на равенство, а не одно выражение предиката. Шаблон from-join сопоставляется со стандартным оператором запросов Enumerable.Join (), который задает два отдельных делегата, которые используются для вычисления значений, которые затем можно сравнивать. Он нужен как отдельные делегаты для создания таблицы поиска с одним и зондом. в таблицу поиска с другим. Полный обработчик запросов, такой как SQL, может свободно исследовать одно предикатное выражение и выбирать, как он будет обрабатывать его. Тем не менее, чтобы заставить LINQ работать аналогично SQL, необходимо всегда указывать условие соединения. как дерево выражений, значительные издержки для простого случая объекта в памяти. "

Однако это касается join. Я не уверен, что equals должен использоваться в вашем примере кода (он даже компилируется?).

16 голосов
/ 14 июля 2009

Ваша первая версия не компилируется. Вы только используете equals в соединениях, чтобы сделать отдельные половины эквиджоина понятными для компилятора.

...