Разница между выражением запроса и выражением метода в LINQ?
Я не знаю, подходит ли термин вышеупомянутого заголовка.
Также как a
и b
:
var list = Enumerable.Range(0, 100);
var a = from l in list
where l % 2 == 0
select l;
var b = list.Where(l => l % 2 == 0);
Когда я должен использовать каждый из них? И какая разница?
Ответы
Ответ 1
Нет, выражение запроса компилируется в выражение метода.
Синтаксис запроса и синтаксис метода в LINQ (С#)
Поскольку запросы возвращают IEnumerable, вы создаете их в методе синтаксис путем объединения метода вызовы. Это то, что компилятор делает за кулисами при написании запросов с помощью синтаксиса запроса
Также см.: Выражения запроса LINQ (Руководство по программированию на С#)
Во время компиляции выражения запроса преобразуются в вызовы метода стандартного запроса в соответствии с правилами, изложенными в С# Спецификация. Любой запрос, который может быть выражен с помощью синтаксиса запроса также можно выразить с помощью синтаксиса метода. Однако в большинстве случаев Синтаксис запроса более читабельен и краток. Для получения дополнительной информации см. Обзор языка С# и стандартные операторы запросов.
Кроме того, в одном месте, где я нашел то, что не может быть сделано в выражении Query, нужно получить индекс вместе с элементом. Например, вы можете сделать следующее в синтаксисе метода:
var result = list.Select((r,i) => new { value = r, index = i});
В выражении запроса для достижения этой цели необходимо определить внешнюю переменную. Вот аналогичная дискуссия с ответом от Jon Skeet
Ответ 2
Нет
Между ними нет никакой разницы.
От Query Syntax and Method Syntax in LINQ
Поскольку запросы возвращают IEnumerable, вы создаете их в методе синтаксис путем объединения метода вызовы. Это то, что компилятор делает за кулисами, когда вы пишете запросы, используя запрос синтаксис. И поскольку переменная запроса не сохраняет результаты запроса, вы можете изменить его или использовать в качестве основы для нового запроса в любом времени, даже после его выполнения.
Также из LINQ Query Expressions
Во время компиляции выражения запроса преобразуются в стандартный запрос Вызов метода оператора.
Ответ 3
Выражение запроса преобразуется в стандартные вызовы методов компилятором.
var a = from l in list
where l % 2 == 0
select l;
var b = list.Where(l => l % 2 == 0);
Эти два являются точно такими же в скомпилированном коде.
Однако не все методы имеют ключевое слово, связанное в синтаксисе выражений запроса.
Ответ 4
Нет никакой разницы, это вопрос личных предпочтений. Вы даже можете смешивать два стиля, если хотите.
Слова Linq переводятся в синтаксис вызова метода компилятором С#.
Ответ 5
Разница, по сути, не является.
На самом деле это одно и то же, за исключением того, что выражение для $a $компилятор преобразуется в выражение, эквивалентное выражению для $b $.