2014-12-23 2 views
0

Я изучаю LINQ и только что встретил одну очень странную вещь. Вот запрос:Пожалуйста, объясните, вложенная группировка LINQ

(http://msdn.microsoft.com/en-us/library/bb545974.aspx)

Там нет выбора статьи, одна группа группируется по другой группе, я просто не могу обернуть свой ум вокруг этого. Можете ли вы объяснить этот запрос или, может быть, продемонстрировать эквивалентный запрос в SQL? Спасибо!

ответ

2

Когда ваш первый запрос выполняется т.е.

from student in students 
group student by student.Year 

Это вернет IEnumerable<IGrouping<string,Student>> объект, значит, вы будете иметь несколько элементов (IEnumerable) группы, и что группа состоит из ключа (student.Year, который имеет тип string) и объекты, попадающие под эту группу (Student в этом случае).

Теперь, так как это Student объект сам может быть IEnumerable (объекты под каждой клавишей (год)), мы снова quering его &, так как вам нужно снова группа это IEnumerable объект с LastName, поэтому снова Шаг 1 будет повторяться т.е. вновь вернется IEnumerable<IGrouping<string,Student>> объект, где ключ будет «student.LastName» & Student будет объект со всеми студентами, имеющими LastName, как Key: -

from student in newGroup1 
group student by student.LastName 

Теперь, так как наш исходный объект должен группе Year, мы снова группировка по newGroup1.Key, который является ничем иным, как student.Year.

Кроме того, вам не нужно выбирать, когда запрос заканчивается предложением group by. Ваш запрос LINQ может завершиться либо оператором select, либо группой.

Edit: - Согласно примеру, год является Enum, поэтому возвращаемый тип будет немного отличаться от того, что я уже упоминал ранее, просто запустите ниже запрос и увидеть результаты: -

IEnumerable<IGrouping<StudentClass.GradeLevel, StudentClass.Student>> group1 = 
                from student in students 
                group student by student.Year; 

Отметьте, что, как студенты сгруппированы на основе Year, мы хотим, чтобы эти студенты были дополнительно сгруппированы по LastName, поэтому мы использовали ключевое слово into, которое хранит вывод в новый идентификатор, который можно запросить в дальнейшем. Поэтому забудьте исходный результат и теперь сосредоточьтесь на выводе, полученном нами от group1 выше, нам нужно сгруппировать студентов по LastName и, следовательно, внутренний запрос (from student in newGroup1 group student by student.LastName), но помните, что мы должны сохранить группировку, которую мы сделали на шаге 1, т. Е. Мы имеем для группировки студентов по фамилии, но только в течение каждого года, поэтому мы группируем этот второй результат запроса по оригинальному ключу, т.е. «Год».

+0

cna вы разрабатываете с рабочим примером, меня интересует \ –

+0

ну ... первая часть приводит к некоторым {{Year1 {s1A, s1B, ...}}, {Year2 {s2A, s2B, ...} }, ...}, а вторая часть - в {{LastNameA {sA1, sA2, ...}}, {LastNameB {sB1, sB2, ...}}, ...} коллекции. И тогда ... эти две коллекции присоединились? или что там происходит? Одна из сложнейших вещей здесь заключается в том, как первая часть запрашивается со второй части, могу ли я подумать о 1-й части как об общем табличном выражении в T-SQL? – Tsayper

+0

@ EhsanSajjad, @ tsayper - Пожалуйста, проверьте мое обновление. –

Смежные вопросы