Это Linq или Lambda?

105

Я знаю, что это Linq:

var _Results = from item in _List
                where item.Value == 1
                select item;

И я знаю, что это лямбда:

var _Results = _List.Where(x => x.Value == 1);

Примечание редактора: это не просто Lambda, это Linq, использующий «синтаксис метода», предикатом которого является Lambda. Для ясности, оба приведенных выше примера являются Linq (мое исходное сообщение было неверным, но я оставил ошибку, чтобы проиллюстрировать путаницу, вызвавшую вопрос).

Но является ли Linq подмножеством Lambda или как?

Почему есть две, казалось бы, одинаковые техники?

Есть ли техническая причина выбирать одно вместо другого?

Джерри Никсон
источник
2
Исправление: lambdaexpression.net
Джерри Никсон

Ответы:

135

Это LINQ (с использованием синтаксиса запроса):

var _Results = from item in _List
                where item.Value == 1
                select item;

Это тоже LINQ (с использованием синтаксиса метода):

var _Results = _List.Where(x => x.Value == 1);

Интересно отметить, что обе эти разновидности в конечном итоге создадут один и тот же код. Компилятор предлагает вам услугу, позволяя вам выражать свои пожелания так, как вы предпочитаете.

А это лямбда:

x => x.Value == 1

Когда вы решаете использовать синтаксис метода, LINQ почти всегда встречается с лямбда-выражениями. Но LINQ и лямбды - это две совершенно разные вещи, которые можно использовать сами по себе.

Обновление: как справедливо указывает svick, LINQ с синтаксисом запроса также реализован с использованием лямбда-выражений (как упоминалось ранее, компилятор позволяет вам писать в синтаксисе запроса, но эффективно преобразует его в синтаксис метода за вашей спиной). Это просто нагромождение того факта, что оба варианта полностью эквивалентны и будут вести себя одинаково (например, лямбда-выражения могут вызывать создание замыканий ).

Джон
источник
2
Я думаю, стоит упомянуть, что синтаксис запросов также использует лямбды за кадром. Это может быть важно из-за закрытия.
svick
34

Оба являются Linq. Второй использует лямбды .

Лямбды - это объекты типа встроенного метода, которые вы передаете в качестве параметра функции Where во втором примере.

Разница между этими двумя синтаксисами чисто синтаксическая. Второй стиль linq с использованием вызовов методов - это то, как он работает под капотом. Первый предназначен для более удобного / простого использования, и компилятор преобразует его в вызовы методов за кулисами. Они должны работать одинаково для любого заданного запроса, хотя, конечно, компилятор может выбрать несколько другую интерпретацию сложного запроса linq, чем при преобразовании в стиль метода.

Эта статья msdn также может быть интересна: синтаксис запроса LINQ против синтаксиса метода . Особое значение имеет: «В общем, мы рекомендуем синтаксис запроса, потому что он обычно проще и читабельнее; однако нет семантической разницы между синтаксисом метода и синтаксисом запроса».

Крис
источник
6
Лично я считаю синтаксис метода более читабельным - возможно, потому, что большая часть моего кода относится к разновидности LINQ to Objects. Но если у вас большой опыт работы с SQL, возможно, сначала будет легче понять синтаксис запроса.
Том Бушелл,
@Tom Bushell, даже синтаксис JOIN? Шутки в сторону?
Джерри Никсон,
@ Том Бушелл: я тоже. Я перефразировал кое-что на этой странице MSDN, что, по-видимому, объясняет, почему они потрудились разработать этот синтаксис, а не просто использовать стиль метода. Обычно я просто делаю относительно простые вещи, а не объединяю или что-то еще более сложное (то есть в основном фильтрую или операции сопоставления один в один).
Крис
@Jerry - как и Крис, моя работа с LINQ до сих пор была довольно простой. Я читал, что синтаксис запросов обычно предпочтительнее при выполнении SelectMany, Join или GroupJoin - мне просто не нужно было делать что-либо подобное - пока!
Том Бушелл,
1
Внутренне «синтаксис запроса» в командах LINQ to SQL и LINQ to Entities назывался «синтаксисом понимания».
DamienG