在Where子句之前的OrderBy子句 - 性能?

Sar*_*ana 13 c# linq

我试图了解在Where子句之前使用OrderBy子句是否有任何性能损失,如下所示:

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

var ns = names.OrderBy(n => n).Where(n => n.Length == 5);
Run Code Online (Sandbox Code Playgroud)

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

Moh*_*han 13

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

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

var ns = names.OrderBy(n => n).Where(n => n.Length == 5);
Run Code Online (Sandbox Code Playgroud)

迭代时,将转换为:

SELECT * FROM names WHERE LEN(name) == 5 ORDER BY name
Run Code Online (Sandbox Code Playgroud)

无论你把OrderBy条款放在哪里.

所以在这种情况下,没有性能损失.但是当使用LINQ to Objects时(如您的示例所示),这两种变体在性能上有很大差异.这个答案形式Jon Skeet很好地涵盖了这个案例.