对分组操作执行子查询
本文演示创建查询的两种不同方式,此查询将源数据排序成组,然后分别对每个组执行子查询。 每个示例中的基本方法是使用名为 newGroup
的“接续块”对源元素进行分组,然后针对 newGroup
生成新的子查询。 针对由外部查询创建的每个新组运行此子查询。 请注意,在此特定示例中,最终输出不是组,而是一系列匿名类型。
有关如何分组的详细信息,请参阅 group 子句。
有关接续块的详细信息,请参阅 into。 下面的示例使用内存数据结构作为数据源,但相同的原则适用于任何类型的 LINQ 数据源。
示例
注意
本主题中的示例使用查询对象集合中的示例代码中的 Student
类和 students
列表。
var queryGroupMax =
from student in students
group student by student.Year into studentGroup
select new
{
Level = studentGroup.Key,
HighestScore = (
from student2 in studentGroup
select student2.ExamScores.Average()
).Max()
};
int count = queryGroupMax.Count();
Console.WriteLine($"Number of groups = {count}");
foreach (var item in queryGroupMax)
{
Console.WriteLine($" {item.Level} Highest Score={item.HighestScore}");
}
此外,还可以使用方法语法编写上述代码片段中的查询。 下面的代码片段具有使用方法语法编写的语义上等效的查询。
var queryGroupMax =
students
.GroupBy(student => student.Year)
.Select(studentGroup => new
{
Level = studentGroup.Key,
HighestScore = studentGroup.Select(student2 => student2.ExamScores.Average()).Max()
});
int count = queryGroupMax.Count();
Console.WriteLine($"Number of groups = {count}");
foreach (var item in queryGroupMax)
{
Console.WriteLine($" {item.Level} Highest Score={item.HighestScore}");
}