В этом случае он использует SelectMany
и концепцию под названием прозрачные идентификаторы , которая сохраняет существующие переменные диапазона.Таким образом, ваш запрос будет преобразован в:
var query = Enumerable.Range(0, 10)
.SelectMany(item => Enumerable.Range(item, 10),
(item, item2) => new { item, item2 })
.SelectMany(z => Enumerable.Range(z.item2, 10),
(z, item3) => new { z.item, z.item2, item3 });
(В этом случае z
является прозрачным идентификатором. Если бы было предложение where
или что-либо, кроме select
после последнего from
предложение, другой прозрачный идентификатор был бы введен.)
Все переводы описаны в спецификации языка C #, раздел 7.16.