Linq查询中OrderBy、Where、Select的顺序问题

3

考虑以下示例代码

System.Collections.ArrayList fruits = new System.Collections.ArrayList();
fruits.Add("mango");
fruits.Add("apple");
fruits.Add("lemon");

IEnumerable<string> query = fruits.Cast<string>()
    .OrderBy(fruit => fruit)
    .Where(fruit => fruit.StartsWith("m"))                
    .Select(fruit => fruit);

我有两个问题:

  1. 如果Where本身返回相同类型,我是否需要编写最后一个Select子句呢?这个例子来自MSDN,为什么他们总是写它?
  2. 这些方法的正确顺序是什么?顺序是否会影响结果?如果我交换SelectWhereOrderBy会发生什么?

你能链接到MSDN上展示那种select的内容吗? - Lasse V. Karlsen
@LasseV.Karlsen 我添加了额外的Where,但对于Select有疑问 https://msdn.microsoft.com/ru-ru/library/bb341406(v=vs.110).aspx - Wachburn
那个例子是虚假的,因为@BruceJonston已经回答了。 - Lasse V. Karlsen
1
考虑到第一点,请参见https://dev59.com/ymUo5IYBdhLWcg3w1yTH - w.b
1
筛选(where),排序(order by),限制(skip/take),转换(select)...除非转换是其他步骤所必需的,否则应按顺序执行转换、筛选、排序、限制。 - Matthew Whited
2个回答

8
  1. 如果您没有实际转换返回类型,则不需要使用Select

  2. 在这种情况下,方法调用的顺序可能会影响性能。在过滤之前对所有对象进行排序肯定比在较小的数据集上进行过滤然后再进行排序要耗时更长。


1
如果我使用EF,那么性能方面的影响会发生吗?因为EF只是在流中创建SQL查询,所以我可以随意放置OrderBy吗?还是在接收数据后,L2O将加入执行其他操作? - Wachburn
@sstan关于OrderBySelect的顺序,哪一个在性能方面应该先使用? - nam

5
在这种情况下,.Select是不必要的,因为.Cast已经保证你正在使用IEnumerable<string>。
.OrderBy和.Where的排序不会影响查询结果,但通常如果您首先使用.Where,您将获得更好的性能,因为需要排序的元素较少。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接