对分组操作执行子查询

本文演示创建查询的两种不同方式,此查询将源数据排序成组,然后分别对每个组执行子查询。 每个示例中的基本方法是使用名为 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}");
}

请参阅