我正在查看一些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()是不必要的)?
答案 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语法语句)最后需要一个特殊的子句来表示查询的结果应该是什么。如果没有select
,group 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。
常见的错误是将Select
与Where
混合在一起。
items.Where(i => i.ID == 1);
会返回IEnumerable<item>
items.Select(i => i.ID == 1);
会返回IEnumerable<bool>
作为Select将每个项目投射到传入函数的结果中..