LINQ语句中是Select可选吗?

B. *_*non 2 linq ienumerable select tolist take

我正在查看一些LINQ示例,因此提醒他们应该在最后有一个"select"子句.

但我有一个LINQ工作,没有"选择":

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();
}
Run Code Online (Sandbox Code Playgroud)

这是因为:

(a) select is not really necessary?
(b) Take() is doing the "select"
(c) ToList() is doing the "select"
Run Code Online (Sandbox Code Playgroud)

说实话,这是在我添加"ToList()"之前的工作......所以看起来LINQ在允许一个人逃脱的方面是非常宽容/宽松的.

另外,在我正在使用的LINQ中,我认为OrderBy和ThenBy是冗余的,因为用于填充inventoryItems的SQL查询已经具有ORDER BY ID,PackSize子句.我是对的(.OrderBy()和.ThenBy()是不必要的)?

cwh*_*ris 7

Linq语句确实需要一个select子句(或其他条款,如a group by).但是,你没有使用Linq语法,你正在使用Linq Enumerable扩展方法,这些方法都是(大部分)返回的IEnumerable<T>.因此,他们不需要Select操作员.

var result = from item in source
             where item.Value > 5
             select item;
Run Code Online (Sandbox Code Playgroud)

完全一样

var result = source.Where(item => item.Value > 5);
Run Code Online (Sandbox Code Playgroud)

为了完整性:

var result = from item in source
             where item.Value > 5
             select item.Value;
Run Code Online (Sandbox Code Playgroud)

完全一样

var result = source.Where(item => item.Value > 5)
                   .Select(item => item.Value);
Run Code Online (Sandbox Code Playgroud)

Linq语句(Linq语法语句)最后需要一个特殊的子句来表示查询的结果应该是什么.如果没有select,group by或其他选择条款,语法是不完整的,并且编译器不知道如何改变表达到适当的扩展方法(这是Linq的语法实际上被编译到).

到目前为止ToList,这是一个返回的Enumerable扩展方法,而是一个.当您使用或将被立即列举并转换为一个列表或数组.如果您的查询很复杂并且您需要多次枚举结果而不多次运行查询,这将非常有用.IEnumerable<t>List<T>ToListToArrayEnumerable