Что подразумевается под "Linq оценивает запрос по одному методу за раз"? - PullRequest
0 голосов
/ 26 сентября 2011

Я где-то читал, что " Linq оценивает запрос по одному методу за раз ".Что именно это означает?Возможно, что операторы вызываются в указанном порядке - например, в следующем коде Select вызывается до Where:

var results = someCollection.Select(...).Where(...);

, а здесь Where вызывается до Select:

var results = someCollection.Where(...).Select(...);

Это то, что подразумевается под " вычислением запроса по одному методу за раз "?

Спасибо

1 Ответ

2 голосов
/ 26 сентября 2011

Без цитаты, которая говорит нам, где именно вы это читаете, мы можем только догадываться о значении.

Я бы истолковал эту фразу как означающую, что несколько методов LINQ действуют как конвейер, то есть каждый фрагмент данных проходит до того, как следующий.

Например:

var numbers = new[] { 1, 2, 3 };

var results = numbers.Select(number => number * 2).Where(number => number > 3);

При энергичной оценке выполнение будет выглядеть так:

1, 2, 3 -> Select -> 2, 4, 6 -> Where -> 4, 6

Однако при отложенной оценке каждый результат вычисляется, когда он необходим. Это превращает выполнение методов «вертикальный» вместо «горизонтальный», выполняя все методы для каждого элемента данных, а затем снова начиная со следующего элемента данных:

1 -> Select -> 2 -> Where -> nothing
2 -> Select -> 4 -> Where -> 4
3 -> Select -> 6 -> Where -> 6

Конечно, это не так для методов, которые работают со всем набором, таких как Distinct и OrderBy. Все элементы данных должны «объединяться», пока выполнение не может быть продолжено. Однако по большей части методы LINQ запрашивают элементы из источника только тогда, когда они сами запрашивают другой элемент.

...