16

我试图了解在 Where 子句之前使用 OrderBy 子句是否会影响性能,如下所示:

List<string> names = new List<string> { //... };

var ns = names.OrderBy(n => n).Where(n => n.Length == 5);

还是编译器会重新排列指令,以便在 OrderBy 子句之前执行 Where 子句?

4

1 回答 1

16

这实际上取决于 LINQ 提供程序(实现的类IQueryable<T>)。

在 Entity Framework 和 LINQ to SQL(以及其他与数据库相关的 LINQ 提供程序)上,查询被转换为 SQL 语句,然后将在数据库引擎上运行。例如,这个查询:

var ns = names.OrderBy(n => n).Where(n => n.Length == 5);

迭代时,将转换为:

SELECT * FROM names WHERE LEN(name) == 5 ORDER BY name

不管你把OrderBy条款放在哪里。

因此,在这种情况下,不会影响性能。但是当使用 LINQ to Objects 时(如您的示例),这两种变体在性能上有很大差异。Jon Skeet 的这个答案很好地涵盖了这个案例。

于 2013-05-25T04:30:02.593 回答