【问题标题】:Is Select optional in a LINQ statement?Select 在 LINQ 语句中是可选的吗?
【发布时间】:2013-11-21 16:00:30
【问题描述】:

我正在查看一些 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() 是不必要的)?

【问题讨论】:

  • 旁注:在 VB.NET 中,Select 始终是可选的,如果有疑问,会自动创建具有多个属性的 IEnumerable(Of anonymous type)

标签: linq select ienumerable


【解决方案1】:

Linq 语句实际上确实需要select 子句(或其他子句,例如group by)。但是,您没有使用 Linq 语法,而是使用了 Linq Enumerable 扩展方法,所有(大部分)都返回 IEnumerable&lt;T&gt;。因此,它们不需要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 扩展方法之一,返回IEnumerable&lt;t&gt;,而是返回List&lt;T&gt;。当您使用ToListToArray 时,Enumerable 会立即枚举并转换为列表或数组。如果您的查询很复杂并且需要多次枚举结果而不运行多次查询,这将非常有用)。

【讨论】:

  • 啊,所以我想我现在明白了:倒置的(select-at-the-end)类 sql 语句需要 select,但是“流利”的语法(就像我正在使用的那样)没有。
  • Tim,重点是要注意您确实不需要 需要一个 select 语句......我们并不是要展示需要使用 select 运算符的情况。
【解决方案2】:

只有在要将对象投影到不同类型时才使用 select..

如果您有一个列表,其中包含一个 ID 属性为 int 的对象

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

newList 将是 IEnumerable&lt;int&gt;


注意。

一个常见的错误是将SelectWhere 混淆。

items.Where(i =&gt; i.ID == 1); 返回一个IEnumerable&lt;item&gt;

items.Select(i =&gt; i.ID == 1); 返回一个IEnumerable&lt;bool&gt;

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

【讨论】:

  • 这不能回答所提出的问题。
  • @ChristopherHarris 也许我的回答不够清楚。我的意思是.. 当您想要与 IEnumerable 中的类型不同的类型时,您需要使用 select。
猜你喜欢
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多