Почему это не работает с LINQ для объектов?
LINQ для объектов не использует деревья выражений.Оператор напрямую превращается в серию вызовов методов, каждый из которых выполняется как обычный метод C #.
Таким образом, в LINQ to Objects следующее:
var results = collection.OrderBy(x => x.Id)
.Where(x => x.Name == "gdoron")
.ToList();
Получает превращение впрямые вызовы методов:
var results = Enumerable.ToList(
Enumerable.Where(
Enumerable.OrderBy(collection, x => x.Id),
x => x.Name = "gdoron"
)
);
Изучив вызовы методов, вы поймете, почему порядок имеет значение.В этом случае, поместив OrderBy первым, вы фактически вкладываете его в самый внутренний вызов метода.Это означает, что вся коллекция будет заказана, когда будут пересчитаны результаты.Если вы должны были изменить порядок:
var results = collection
.Where(x => x.Name == "gdoron")
.OrderBy(x => x.Id)
.ToList();
Тогда результирующая цепочка методов переключается на:
var results = Enumerable.ToList(
Enumerable.OrderBy(
Enumerable.Where(collection, x => x.Name = "gdoron"),
x => x.Id
)
);
Это, в свою очередь, означает, что сортировать нужно только отфильтрованные результаты.как выполняется OrderBy.