我正在学习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中演示一个等价的查询吗? 谢谢!
答案 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步中,我们必须按姓氏对学生进行分组,但仅限于每年,因此我们将第二个查询结果按原始密钥分组,即'年'。