Это тоже считается подзапросом?

Я знаю, как работают следующие запросы, я просто запутался в терминологии.

Каждый запрос начинается с обязательного предложения FROM и должен заканчиваться предложением SELECT или GROUP. Между двумя предложениями мы можем поместить любое количество необязательных предложений FROM...LET...WHERE. Подзапрос — это просто запрос в запросе, что означает, что он тоже имеет ту же структуру:

var result = from p1 in artists
             from p3 in (from p2 in p1.albums
                         select new { ID = p2.id, Title = p2.title }) 
             select p3;

Но в отличие от подзапроса в приведенном выше примере, следующий подзапрос ( from p2 in artist.Albums ) не заканчивается своим собственным предложением SELECT/GROUP, поэтому его структура отличается в том смысле, что он начинается с предложения FROM, а не заканчивается Предложение SELECT/GROUP. Итак, мой вопрос: применим ли термин «подзапрос» к from p2 in artist.Albums, хотя его структура немного отличается?

 var result1 = from p1 in artists
               from p2 in p1.Albums
               select new { Artist_id = p1.id, Album_id = p2.id };

Спасибо


person user702769    schedule 22.09.2011    source источник


Ответы (2)


Во втором запросе, result1, нет подзапроса, только запрос с двумя предложениями from.

За кулисами использование двух предложений from таким образом будет преобразовано в операцию SelectMany:

artists.SelectMany( p1      => p1.albums
                   ,(p1,p2) => new { Artist_id = p1.id, Album_id = p2.id })
person Mark Cidade    schedule 22.09.2011
comment
Да, но не похоже ли поведение p2 в p1.Albums на подзапрос в том смысле, что для каждого внешнего элемента p1 перечисляется вся его коллекция (p1.Albums)? - person user702769; 23.09.2011
comment
Да, p1.albums совпадает с выражением подзапроса from p2 in p1.albums select p2, но то, как составлены выражения запроса, определяет, есть ли у вас выражение запроса с выражениями подзапроса или без них. Если есть только одно предложение select и нет предложений group by, то это всего лишь одно выражение запроса (возможно, с несколькими предложениями from). Считать ли что-то запросом в любом случае более субъективно, но когда дело доходит до синтаксиса выражений запроса, он более четко определен. - person Mark Cidade; 23.09.2011
comment
Мне очень жаль, что я отнял у вас время, я отмечу это как отвеченное через день или два, независимо от того, ответите вы на это или нет. В любом случае, что вы подразумеваете под ... и без групповых предложений...? Я бы предположил, что если в запросе есть только одно предложение SELECT или только одно предложение GROUP, то запрос имеет только одно выражение запроса без каких-либо подзапросов?! И если в запросе Q есть предложение GROUP INTO, за которым следует SELECT, то Q концептуально разделяется на два выражения запроса (другими словами, Q не имеет выражения запроса с подзапросом)?! - person user702769; 24.09.2011
comment
Я имею в виду, что если он имеет только одно предложение select или одно предложение group by (без какого-либо другого предложения), то это всего лишь одно выражение запроса, в отличие от двух или более предложений select или двух предложений group by или по одному из каждого ( что сделало бы его более чем одним выражением запроса). - person Mark Cidade; 24.09.2011

Нет, внизу вы делаете неявное соединение, а не подзапрос. При соединении вы запрашиваете обе таблицы одновременно (в одном запросе).

person Dave    schedule 22.09.2011