Является ли 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 проецирует каждый элемент в результат функции, переданной в..