Это будет переводиться в код концептуально так:
var r = products.SelectMany(p => departments, (p, d) = new { p, d })
.SelectMany(z => something, (z, c) => new { z, c })
.Select(zz => zz.z.p);
Обычно каждый from
после первого добавляет дополнительный вызов к SelectMany
. На самом деле, в этом случае компилятор заметит, что после последнего предложения from
есть просто select
, и он на самом деле переведет это:
var r = products.SelectMany(p => departments, (p, d) = new { p, d })
.SelectMany(z => something, (z, c) => z.p);
... но я склонен сначала думать о «логической» форме.
Обратите внимание, что в этом случае вы не использовали более ранние переменные диапазона в предложениях from
, но вы можете:
var query = from person in people
from friend in person.Friends
select person.Name + " is friends with " + friend.Name;