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
в соединениях, чтобы сделать отдельные половины эквиойно понятными для компилятора.