Когда ваш первый запрос выполняется т.е.
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, т. Е. Мы имеем для группировки студентов по фамилии, но только в течение каждого года, поэтому мы группируем этот второй результат запроса по оригинальному ключу, т.е. «Год».
cna вы разрабатываете с рабочим примером, меня интересует \ –
ну ... первая часть приводит к некоторым {{Year1 {s1A, s1B, ...}}, {Year2 {s2A, s2B, ...} }, ...}, а вторая часть - в {{LastNameA {sA1, sA2, ...}}, {LastNameB {sB1, sB2, ...}}, ...} коллекции. И тогда ... эти две коллекции присоединились? или что там происходит? Одна из сложнейших вещей здесь заключается в том, как первая часть запрашивается со второй части, могу ли я подумать о 1-й части как об общем табличном выражении в T-SQL? – Tsayper
@ EhsanSajjad, @ tsayper - Пожалуйста, проверьте мое обновление. –