请解释 LINQ 嵌套分组
本文关键字:嵌套 LINQ 解释 | 更新日期: 2023-09-27 18:34:57
我正在学习 LINQ,刚刚遇到了一件非常奇怪的事情。下面是查询:
var queryNestedGroups =
from student in students
group student by student.Year into newGroup1
from newGroup2 in
(from student in newGroup1
group student by student.LastName)
group newGroup2 by newGroup1.Key;
(http://msdn.microsoft.com/en-us/library/bb545974.aspx(
没有选择子句,一个组由另一个组分组,我只是无法解决这个问题。您能否解释此查询,或者演示 SQL 中的等效查询?谢谢!
当您的第一个查询执行时,即
from student in students
group student by student.Year
这将返回IEnumerable<IGrouping<string,Student>>
对象,这意味着您将拥有一个组的多个项目(IEnumerable(,并且该组由Key(学生(组成。类型为string
(的年份和属于该组的对象(在本例中为Student
(。
现在由于这个Student
对象本身就是一个IEnumerable
(每个键下的对象(Year((,我们再次查询它,并且由于您需要再次将这个IEnumerable对象与LastName
分组,因此步骤1将再次重复,即它将再次返回IEnumerable<IGrouping<string,Student>>
对象,其中键将是"学生"。姓氏"和Student
将是对象,所有学生都将姓氏作为键:-
from student in newGroup1
group student by student.LastName
现在,由于我们的原始对象应该按Year
分组,我们再次按newGroup1.Key
分组,这只不过是student.Year
。
此外,当查询以分组依据子句结束时,不需要选择。LINQ 查询可以以选择运算符或组运算符结尾。
编辑:-根据示例,Year 是一个枚举,因此返回类型与我之前提到的略有不同,只需运行以下查询并查看输出:-
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 中所做的分组,即我们必须按姓氏对学生进行分组,但仅限于每年, 因此,我们按原始键(即"年份"(对第二个查询结果进行分组。