Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 请解释LINQ嵌套分组_C#_Sql_Linq - Fatal编程技术网

C# 请解释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

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

这里没有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-嘿,
进入
关键字有什么问题?它用来创建一个临时结果集,可以再次迭代,我不知道你为什么要忽略它。它没什么问题(太棒了!),我只是好奇