Wykonywanie podzapytania w operacji grupowaniaPerform a subquery on a grouping operation

W tym artykule przedstawiono dwa różne sposoby, aby utworzyć zapytanie, porządkuje źródła danych w grupach, a następnie indywidualnie wykonuje podzapytania w każdej grupie.This article shows two different ways to create a query that orders the source data into groups, and then performs a subquery over each group individually. Podstawowa technika w każdym przykładzie jest do grupowania elementów źródła przy użyciu kontynuacji o nazwie newGroupi generować nowy podzapytania względem newGroup.The basic technique in each example is to group the source elements by using a continuation named newGroup, and then generating a new subquery against newGroup. Podzapytania ten jest wykonywany dla każdej nowej grupy, który jest tworzony przez zapytanie zewnętrzne.This subquery is run against each new group that is created by the outer query. Należy pamiętać, że w tym konkretnym przykładzie końcowych danych wyjściowych nie jest grupą, ale prosty sekwencję typów anonimowych.Note that in this particular example the final output is not a group, but a flat sequence of anonymous types.

Aby uzyskać więcej informacji na temat grupy, zobacz group — klauzula.For more information about how to group, see group clause.

Aby uzyskać więcej informacji dotyczących kontynuacji, zobacz do.For more information about continuations, see into. W poniższym przykładzie użyto struktury danych w pamięci jako źródło danych, ale te same zasady mają zastosowanie dla każdego rodzaju źródła danych LINQ.The following example uses an in-memory data structure as the data source, but the same principles apply for any kind of LINQ data source.

PrzykładExample

Uwaga

Ten przykład zawiera odwołania do obiektów, które są zdefiniowane w przykładowym kodzie w kwerenda dotycząca kolekcji obiektów.This example contains references to objects that are defined in the sample code in Query a collection of objects.

public void QueryMax()
{
    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}");
    }
}

Zapytania w powyższym fragmencie mogą również będą zapisywane przy użyciu składni metody.The query in the snippet above can also be written using method syntax. Poniższy fragment kodu zawiera zapytanie semantycznie równoważne napisane przy użyciu składni metody.The following code snippet has a semantically equivalent query written using method syntax.

public void QueryMaxUsingMethodSyntax()
{
    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}");
    }
}

Zobacz takżeSee also