Вот как на самом деле это делает компилятор C # с помощью .NET Reflector для проверки:
var myContentObj = context
.CmsContents
.SelectMany(cnt => cnt.CmsCategories,
(cnt, categoy) => new { cnt, categoy })
.Where(a => a.categoy.CategoryId == myCurrentCategoryId
&& a.cnt.ContentId == myCurrentContentId)
.Select(a => a.cnt)
.Single();
По существу, вложенные предложения from
приводят к вызову SelectMany
с прозрачным идентификатором (экземпляр анонимного типа, содержащий «parent» cnt
и «child» categoy
). Фильтр Where
применяется к экземпляру анонимного типа, а затем мы делаем другую проекцию Select
, чтобы вернуть «родителя». Вызов Single
всегда был «вне» выражения запроса, конечно, поэтому должно быть очевидно, как оно вписывается.
Для получения дополнительной информации я предлагаю прочитать статью Джона Скита Как работают выражения запросов .