2014-12-23 49 views

回答

2

当您第一次执行查询即

from student in students 
group student by student.Year 

这将返回IEnumerable<IGrouping<string,Student>>对象,这意味着,你将有一组多个项目(IEnumerable的),并且组包括密钥(student.Year这类型的string)和属于该组的对象(在这种情况下为Student)。

现在,因为这个Student对象本身将是一个IEnumerable(每个键(年)下的对象),我们再次quering它&,因为你需要重新组LastName这IEnumerable的对象,所以再次步骤1将重复即它将再次返回IEnumerable<IGrouping<string,Student>>对象,其中重点将是“student.LastName” & Student将具有姓为重点所有学生对象: - 现在

from student in newGroup1 
group student by student.LastName 

,因为我们原来的目标是通过Year应该组,我们再次按分组3210这只不过是student.Year

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

编辑: - 按照本例中,新年是一个枚举,所以返回的类型将是我刚才提到的略有不同,只需要运行下面的查询,看看输出: -

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

查看这个Fiddle,你会注意到,根据Year对学生进行分组,但我们希望这些学生按LastName进一步分组,所以我们使用了into关键字,它将输出存储到一个可以查询的新标识符中进一步。所以忘了最初的结果,现在关注我们从上面收到的group1的输出,我们需要按姓氏对学生进行分组,因此内部查询(from student in newGroup1 group student by student.LastName),但请记住我们必须保留我们在第1步中完成的分组,即,我们有按姓氏对学生进行分组,但仅在每年内进行分组,因此我们将这个第二查询结果按原始密钥即“年”分组。

+0

cna您详细介绍了一个工作示例,我很感兴趣\ –

+0

那么......第一部分会导致一些{{Year1 {s1A,s1B,...}},{Year2 {s2A,s2B,...} },...}集合,以及第{{LastNameA {sA1,sA2,...}},{LastNameB {sB1,sB2,...}},...}集合中的第二部分。然后..这两个集合加入?或什么去那里?其中一个棘手的问题就是如何从第二部分查询第一部分,我可以想象第一部分是T-SQL中的公用表表达式? – Tsayper

+0

@ EhsanSajjad,@ tsayper - 请检查我的更新。 –