Подтвердить что ты не робот

Linq: В чем разница между == и equals в соединении?

Я всегда задавался вопросом, почему ключевое слово 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] Перефразировал вопрос и пересмотрел примеры.

4b9b3361

Ответ 1

Там хорошее объяснение Мэтта Уоррена в The Moth:

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

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

Ответ 2

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