from i in collectiona
join j in collectionb
on x equals y
Этот код переводится в вызов Enumerable.Join:
collectiona.Join(
collectionb,
i => x,
j => y,
(i, j) => new {i, j}
)
Отсюда легко увидеть, что i
находится в области видимости для выражения x, тогда как j
не является.
from i in collectiona
from j in collectionb
where z
эквивалентно:
collectiona
.SelectMany(i => collectionb, (i, j) => new {i, j})
.Where(q => z)
Каждый q
имеет i
и j
, доступные для использования в выражении z