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();

[РЕДАКТИРОВАТЬ] Перефразировал вопрос и пересмотрел примеры.

2 ответа

Решение

Есть прекрасное объяснение Мэтта Уоррена из The Moth:

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

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

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

Другие вопросы по тегам