Предложение OrderBy before Where where - производительность?

Я пытаюсь понять, есть ли какой-либо удар производительности при использовании предложения OrderBy перед предложением Where так:

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

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

Или будут ли команды компилятора переупорядочить так, чтобы предложение Where выполнялось перед предложением OrderBy?

Ответ 1

Это действительно зависит от поставщика 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 очень хорошо описывает этот случай.