Where子句之前的order子句-性能

本文关键字:子句 性能 order Where | 更新日期: 2023-09-27 18:15:22

我想了解在Where子句之前使用OrderBy子句是否有任何性能影响:

List<string> names = new List<string> { //... };
var ns = names.OrderBy(n => n).Where(n => n.Length == 5);

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

Where子句之前的order子句-性能

这实际上取决于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的回答很好地涵盖了这种情况。