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

Разница между выражением запроса и выражением метода в 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);

Когда я должен использовать каждый из них? И какая разница?

4b9b3361

Ответ 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 $.