请解释LINQ嵌套分组

时间:2014-12-23 05:34:45

标签: c# sql linq

我正在学习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

Theres没有select子句,一个组被另一个组分组,我只是无法围绕这个。你能解释一下这个查询,或者在SQL中演示一个等价的查询吗? 谢谢!

1 个答案:

答案 0 :(得分:2)

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

 from student in students
 group student by student.Year

这将返回IEnumerable<IGrouping<string,Student>>对象,这意味着,您将拥有一个组的多个项目(IEnumerable),该组由Key(student.Year,类型为string)和对象组成属于该群体(在这种情况下为Student)。

现在,由于这个Student对象本身就是IEnumerable(每个键下的对象(年份)),我们再次查询它&amp;因为你需要再次使用LastName对这个IEnumerable对象进行分组,所以再次重复步骤1,即它将再次返回IEnumerable<IGrouping<string,Student>>对象,其中Key将是'student.LastName'&amp; Student将成为所有学生姓氏为密钥的对象: -

from student in newGroup1
group student by student.LastName

现在,由于我们的原始对象应该按Year进行分组,我们将再次按newGroup1.Key进行分组,这只是student.Year

此外,当查询以group by子句结束时,您不需要select。您的LINQ查询可以以select或group运算符结束。

修改: - 根据示例,Year是一个枚举,因此返回类型将与我之前提到的略有不同,只需运行以下查询并查看输出: -

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

检查此Fiddle,您会注意到,学生如何根据Year进行分组,但我们希望这些学生按LastName进一步分组,因此我们使用了{{} 3}} keyword,用于将输出存储到可以进一步查询的新标识符中。所以忘记了初始结果,现在关注我们从上面group1收到的输出,我们需要按LastName对学生进行分组,从而对内部查询(from student in newGroup1 group student by student.LastName)进行分组,但请记住我们必须保留分组。在第1步中,我们必须按姓氏对学生进行分组,但仅限于每年,因此我们将第二个查询结果按原始密钥分组,即'年'。