В Linq методы расширения, такие как Where
, возвращают коллекцию IEnumerable
, а методы сортировки, такие как OrderBy
, возвращают коллекцию IOrderedEnumerable
.
Итак, если у вас есть запрос, который заканчивается на OrderBy
(т.е. возвращает IOrderedEnumerable
), вы не сможете позже добавить метод Where
- компилятор жалуется на тип, передаваемый в Where
.
var query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id);
query = query.Where(p => p.ProcessName.Length < 5);
Однако, если вы делаете все это в одном запросе, это нормально!
var query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id)
.Where(p => p.ProcessName.Length < 5);
Я посмотрел на сборку в Reflector, чтобы увидеть, перекомпилировал ли компилятор какую-либо из операций, но, похоже, этого не произошло. Как это работает?