Во-первых, вы можете легко решить свою проблему, просто добавив еще одно «от» к запросу:
var query = from division in divisions
from department in division.Departments
where department.Name == whatever
select department;
Это именно то, что вы делали; он выбирает последовательность отделов из каждого подразделения и склеивает все эти последовательности вместе, чтобы создать одну длинную последовательность отделов.
Это дает вам приятный синтаксис для сценария «сшить кучу последовательностей». В более общем смысле, иногда вы сталкиваетесь с такой ситуацией:
var bars = from foo in foos
some complicated query logic here
select foo.bar;
var abcs = from bar in bars
some other query logic here
select bar.abc;
и вы хотите выяснить, как сделать это в одном запросе. Вы можете сделать это так:
var abcs = from bar in (
from foo in foos
some complicated query logic here
select foo.bar)
some other query logic here
select bar.abc;
что безобразно , или вы можете сделать это:
var abcs = from foo in foos
some complicated query logic here
select foo.bar into bar
some other query logic here
select bar.abc;
Это точно так же, но читать приятнее. Этот синтаксис называется «продолжение запроса».
Чтобы ответить на ваш конкретный вопрос: не разрешено помещать «доходность» в анонимный метод или лямбду. Это довольно прискорбно, потому что это было бы действительно полезно. Преобразования, которые выполняет компилятор, чтобы заставить анонимные функции и блоки итераторов работать, довольно сложны, и до сих пор мы всегда старались заставить их работать вместе полностью. (То есть вы можете поместить лямбду в блок итератора, но вы не можете поместить блок итератора в лямбду.) Я надеюсь, но не обещаю, что когда-нибудь мы сможем исправить этот код и разрешить итератору блокировать лямбды. (Помните, размышления Эрика о будущих функциях языка предназначены только для развлекательных целей.)