LINQ语句中是Select可选吗?

时间:2013-11-21 16:00:30

标签: linq select ienumerable take tolist

我正在查看一些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();
}

这是因为:

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

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

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

2 个答案:

答案 0 :(得分:7)

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语法语句)最后需要一个特殊的子句来表示查询的结果应该是什么。如果没有selectgroup by或其他选择子句,则语法不完整,并且编译器不知道如何将表达式更改为适当的扩展方法(这是Linq语法实际编译为)。

ToList而言,这是返回Enumerable的{​​{1}}扩展方法之一,而是IEnumerable<t> 。当您使用List<T>ToList时,会立即枚举ToArray并将其转换为列表或数组。如果您的查询很复杂并且您需要多次枚举结果而不需要多次运行查询,这非常有用。)

答案 1 :(得分:1)

只有在想要将对象投影到其他类型时才使用select ..

如果您的列表包含ID属性为int

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

newList将是IEnumerable<int>


NB。

常见的错误是将SelectWhere混合在一起。

items.Where(i => i.ID == 1);会返回IEnumerable<item>

items.Select(i => i.ID == 1);会返回IEnumerable<bool>

作为Select将每个项目投射到传入函数的结果中..

相关问题