Является ли Select необязательным в операторе LINQ?

Я просматривал некоторые примеры LINQ, и мне напомнили, что в конце они должны иметь предложение "select".

Но у меня есть LINQ, который работает и не имеет "Select":

public IEnumerable<InventoryItem> Get(string ID, int packSize, int CountToFetch)
{
    return inventoryItems
        .Where(i => (i.Id.CompareTo(ID) == 0 && i.PackSize > packSize) || i.Id.CompareTo(ID) > 0)
        .OrderBy(i => i.Id)
        .ThenBy(i => i.PackSize)
        .Take(CountToFetch)
        .ToList();
}

Это потому что:

(a) select is not really necessary?
(b) Take() is doing the "select"
(c) ToList() is doing the "select"

По правде говоря, это работало до того, как я добавил "ToList()" также... так что кажется, что LINQ довольно простителен / слаб, в чем он позволяет избежать неприятностей.

Кроме того, в LINQ, который я использую, я думаю, что OrderBy и ThenBy являются избыточными, потому что SQL-запрос, используемый для заполнения инвентаризации, уже имеет ORDER BY ID, предложение PackSize. Я прав (что.OrderBy() и.ThenBy() не нужны)?

2 ответа

Решение

Заявления Linq действительно нуждаются в select пункт (или другие пункты, такие как group by). Однако вы не используете синтаксис Linq, вы используете Linq Enumerable методы расширения, которые все (по большей части) возвращают IEnumerable<T>, Поэтому им не нужны Select оператор.

var result = from item in source
             where item.Value > 5
             select item;

Точно так же, как

var result = source.Where(item => item.Value > 5);

И для полноты:

var result = from item in source
             where item.Value > 5
             select item.Value;

Точно так же, как

var result = source.Where(item => item.Value > 5)
                   .Select(item => item.Value);

Операторы Linq (операторы синтаксиса Linq) нуждаются в специальном предложении в конце, чтобы указать, каким должен быть результат запроса. Без select, group byили другое предложение выбора, синтаксис является неполным, и компилятор не знает, как изменить выражение на соответствующие методы расширения (именно к этому на самом деле компилируется синтаксис Linq).

Так далеко как ToList идет, это один из Enumerable методы расширения, которые не возвращают IEnumerable<t>, но вместо List<T>, Когда вы используете ToList или же ToArray Enumerable немедленно перечисляется и преобразуется в список или массив. Это полезно, если ваш запрос сложный и вам нужно перечислять результаты несколько раз, не выполняя запрос несколько раз).

Вы используете select только тогда, когда хотите проецировать свой объект в другой тип.

если у вас был список, содержащий объект со свойством ID, который был int

var newList = items.Select(i => i.ID);

newList будет IEnumerable<int>


NB.

Распространенная ошибка - перепутать Select с Where,

items.Where(i => i.ID == 1); возвращает IEnumerable<item>

items.Select(i => i.ID == 1); возвращает IEnumerable<bool>

так как Select проецирует каждый элемент в результат функции, переданной в..

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