Realizar una subconsulta en una operación de agrupaciónPerform a subquery on a grouping operation

En este artículo se muestran dos maneras diferentes de crear una consulta que ordena los datos de origen en grupos y, luego, realiza una subconsulta en cada grupo de forma individual.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. La técnica básica de cada ejemplo consiste en agrupar los elementos de origen usando una continuación denominada newGroup y después generar una nueva subconsulta en 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. Esta subconsulta se ejecuta en cada uno de los nuevos grupos creados por la consulta externa.This subquery is run against each new group that is created by the outer query. Tenga en cuenta que en este ejemplo concreto el resultado final no es un grupo, sino una secuencia plana de tipos anónimos.Note that in this particular example the final output is not a group, but a flat sequence of anonymous types.

Para obtener más información sobre cómo agrupar, consulte group clause (Cláusula group).For more information about how to group, see group clause.

Para obtener más información sobre continuaciones, consulte into.For more information about continuations, see into. En el ejemplo siguiente se usa una estructura de datos en memoria como origen de datos, pero se aplican los mismos principios para cualquier tipo de origen de datos 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.

EjemploExample

Nota

Este ejemplo contiene referencias a objetos que se definen en el código de ejemplo de Query a collection of objects (Consultar una colección de objetos).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}");
    }
}

La consulta del fragmento de código anterior también se puede escribir con la sintaxis de método.The query in the snippet above can also be written using method syntax. El siguiente fragmento de código tiene una consulta semánticamente equivalente escrita con sintaxis de método.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}");
    }
}

Vea tambiénSee also