C# 请解释LINQ嵌套分组
我正在学习LINQ,刚刚遇到了一件非常奇怪的事情。 问题是:C# 请解释LINQ嵌套分组,c#,sql,linq,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 ne
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;
()
这里没有select子句,一个组被另一个组分组,我就是想不起来。您可以解释这个查询,或者用SQL演示一个等价的查询吗?
谢谢 当第一个查询执行时,即
from student in students
group student by student.Year
这将返回IEnumerable
对象,这意味着您将拥有一个组的多个项目(IEnumerable),该组由键(student.Year,类型为string
)和属于该组的对象(在本例中为student
)组成
现在,由于此Student
对象本身将是一个IEnumerable
(每个键(年份)下的对象),我们再次查询它&因为您需要再次将此IEnumerable对象与LastName
分组,因此,第1步将再次重复,即它将再次返回IEnumerable
对象,其中键为“student.LastName”&student
将是对象,所有学生都将LastName作为键:-
from student in newGroup1
group student by student.LastName
现在,由于我们的原始对象应该按Year
分组,因此我们再次按newGroup1.Key
分组,它只不过是student.Year
此外,当查询以GROUPBY子句结束时,不需要select。LINQ查询可以以select或group运算符结束
编辑:-
根据示例,Year是一个Enum,因此返回类型与我前面提到的略有不同,只需运行以下查询并查看输出:-
IEnumerable<IGrouping<StudentClass.GradeLevel, StudentClass.Student>> group1 =
from student in students
group student by student.Year;
IEnumerable group1=
从学生到学生
每年按学生分组;
勾选此项,您会注意到,学生是如何根据
年份
分组的,但我们希望这些学生按照姓氏
进一步分组,因此我们使用了关键字,它将输出存储到一个新的标识符中,可以进一步查询。因此,忘记最初的结果,现在关注我们从上面的group1
中收到的输出,我们需要按LastName对学生进行分组,从而对内部查询(来自newGroup1中的学生按学生进行分组。LastName)
,但请记住,我们必须保留我们在步骤1中进行的分组,即。,我们必须按姓氏对学生进行分组,但只能在每年内进行分组,因此我们将根据原始关键字(即“年”)对第二个查询结果进行分组。。。第一部分产生一些{Year1{s1A,s1B,},{Year2{s2A,s2B,},},},}集合,第二部分产生一些{LastNameA{sA1,sA2,},},{LastNameB{sB1,sB2,},}集合。然后。。这两个系列是合并的吗?或者去那里干什么?这里的一个棘手问题是如何从第二部分查询第一部分,我是否可以将第一部分看作T-SQL中的一个公共表表达式?ps是否有其他方法可以使用into运算符?我以这个查询结束,不使用into可以使它变得更简单吗@tsayper-嘿,进入
关键字有什么问题?它用来创建一个临时结果集,可以再次迭代,我不知道你为什么要忽略它。它没什么问题(太棒了!),我只是好奇