请解释 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 中的等效查询?谢谢!

请解释 LINQ 嵌套分组

当您的第一个查询执行时,即

 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 中所做的分组,即我们必须按姓氏对学生进行分组,但仅限于每年, 因此,我们按原始键(即"年份"(对第二个查询结果进行分组。