Aggregate (Cláusula, Visual Basic)

Aplica una o más funciones de agregado a una colección.

Sintaxis

Aggregate element [As type] In collection _  
  [, element2 [As type2] In collection2, [...]]  
  [ clause ]  
  Into expressionList  

Partes

Término Definición
element Obligatorio. Variable que se usa para recorrer en iteración los elementos de la colección.
type Opcional. Tipo de element. Si no se especifica ningún tipo, el tipo de element se deduce de collection.
collection Necesario. Hace referencia a la colección en la que se va a operar.
clause Opcional. Una o varias cláusulas de consulta, como Where, para restringir el resultado de la consulta al que se van a aplicar las cláusulas de agregado.
expressionList Necesario. Una o varias expresiones delimitadas por comas que identifican una función de agregado que se va a aplicar a la colección. Puede aplicar un alias a una función de agregado para especificar un nombre de miembro para el resultado de la consulta. Si no se proporciona ningún alias, se usa el nombre de la función de agregado. Para obtener ejemplos, consulte la sección sobre funciones de agregado más adelante en este tema.

Comentarios

La cláusula Aggregate se puede usar para incluir funciones de agregado en las consultas. Las funciones de agregado realizan comprobaciones y cálculos en un conjunto de valores y devuelven un valor único. Puede acceder al valor calculado mediante un miembro del tipo de resultado de la consulta. Las funciones de agregado estándar que puede usar son All, Any, Average, Count, LongCount, Max, Min y Sum. Los desarrolladores están familiarizados con estas funciones, ya que conocen los agregados en SQL. Se describen en la sección siguiente de este tema.

El resultado de una función de agregado se incluye en el resultado de la consulta como campo del tipo de resultado de la consulta. Puede proporcionar un alias para el resultado de la función de agregado a fin de especificar el nombre del miembro del tipo de resultado de la consulta que contendrá el valor agregado. Si no se proporciona ningún alias, se usa el nombre de la función de agregado.

La cláusula Aggregate puede iniciar una consulta o se puede incluir como cláusula adicional en una consulta. Si la cláusula Aggregate inicia una consulta, el resultado es un valor único, que es el resultado de la función de agregado especificada en la cláusula Into. Si se especifica más de una función de agregado en la cláusula Into, la consulta devuelve un único tipo con una propiedad independiente para hacer referencia al resultado de cada función de agregado en la cláusula Into. Si la cláusula Aggregate se incluye como cláusula adicional en una consulta, el tipo devuelto en la colección de consultas tendrá una propiedad independiente para hacer referencia al resultado de cada función de agregado en la cláusula Into.

Funciones de agregado

A continuación, se muestran las funciones de agregado estándar que se pueden usar con la cláusula Aggregate.

Todo

Devuelve true si todos los elementos de la colección cumplen una condición especificada; de lo contrario, devuelve false. A continuación se muestra un ejemplo:

Dim customerList1 = Aggregate order In orders
                    Into AllOrdersOver100 = All(order.Total >= 100)

Any

Devuelve true si algún elemento de la colección cumple una condición especificada; de lo contrario, devuelve false. A continuación se muestra un ejemplo:

Dim customerList2 = From cust In customers
                    Aggregate order In cust.Orders
                    Into AnyOrderOver500 = Any(order.Total >= 500)

Average

Calcula el promedio de todos los elementos de la colección o una expresión proporcionada para todos los elementos de la colección. A continuación se muestra un ejemplo:

Dim customerOrderAverage = Aggregate order In orders
                           Into Average(order.Total)

Count

Cuenta el número de elementos de la colección. Puede proporcionar una expresión Boolean opcional para contar solo el número de elementos de la colección que cumplen una condición. A continuación se muestra un ejemplo:

Dim customerOrderAfter1996 = From cust In customers
                             Aggregate order In cust.Orders
                             Into Count(order.OrderDate > #12/31/1996#)

Group (Grupo)

Hace referencia a los resultados de la consulta que se agrupan como resultado de una cláusula Group By o Group Join. La función Group solo es válida en la cláusula Into de una cláusula Group By o Group Join. Para obtener más información y ejemplos, vea Cláusula Group By y Cláusula Group Join.

LongCount

Cuenta el número de elementos de la colección. Puede proporcionar una expresión Boolean opcional para contar solo el número de elementos de la colección que cumplen una condición. Devuelve el resultado como Long. Para obtener un ejemplo, vea la función de agregado Count.

Max

Calcula el valor máximo de la colección o una expresión proporcionada para todos los elementos de la colección. A continuación se muestra un ejemplo:

Dim customerMaxOrder = Aggregate order In orders
                       Into MaxOrder = Max(order.Total)

Mín.

Calcula el valor mínimo de la colección o una expresión proporcionada para todos los elementos de la colección. A continuación se muestra un ejemplo:

Dim customerMinOrder = From cust In customers
                       Aggregate order In cust.Orders
                       Into MinOrder = Min(order.Total)

Sum

Calcula la suma de todos los elementos de la colección o una expresión proporcionada para todos los elementos de la colección. A continuación se muestra un ejemplo:

Dim customerTotals = From cust In customers
                     Aggregate order In cust.Orders
                     Into Sum(order.Total)

Ejemplo

En el ejemplo siguiente se muestra cómo usar la cláusula Aggregate para aplicar funciones de agregado a un resultado de consulta.

Public Sub AggregateSample()
    Dim customers = GetCustomerList()

    Dim customerOrderTotal =
        From cust In customers
        Aggregate order In cust.Orders
        Into Sum(order.Total), MaxOrder = Max(order.Total),
        MinOrder = Min(order.Total), Avg = Average(order.Total)

    For Each customer In customerOrderTotal
        Console.WriteLine(customer.cust.CompanyName & vbCrLf &
                         vbTab & "Sum = " & customer.Sum & vbCrLf &
                         vbTab & "Min = " & customer.MinOrder & vbCrLf &
                         vbTab & "Max = " & customer.MaxOrder & vbCrLf &
                         vbTab & "Avg = " & customer.Avg.ToString("#.##"))
    Next
End Sub

Creación de funciones de agregado definidas por el usuario

Puede incluir sus propias funciones de agregado personalizadas en una expresión de consulta mediante la adición de métodos de extensión al tipo IEnumerable<T>. Después, el método personalizado puede realizar un cálculo o una operación en la colección enumerable a la que ha hecho referencia la función de agregado. Para obtener más información sobre los métodos de extensión, vea Métodos de extensión.

Así, en el ejemplo siguiente se muestra una función de agregado personalizada que calcula el valor medio de una colección de números. Hay dos sobrecargas del método de extensión Median. La primera sobrecarga acepta, como entrada, una colección de tipo IEnumerable(Of Double). Si se llama a la función de agregado Median para un campo de consulta de tipo Double, se llamará a este método. A la segunda sobrecarga del método Median se le puede pasar cualquier tipo genérico. La sobrecarga genérica del método Median toma un segundo parámetro que hace referencia a la expresión lambda Func(Of T, Double) para proyectar un valor de un tipo (de una colección) como valor correspondiente del tipo Double. A continuación, delega el cálculo del valor medio a la otra sobrecarga del método Median. Para obtener más información sobre las expresiones lambda, vea Expresiones lambda.

Imports System.Runtime.CompilerServices

Module UserDefinedAggregates

    ' Calculate the median value for a collection of type Double.
    <Extension()>
    Function Median(ByVal values As IEnumerable(Of Double)) As Double
        If values.Count = 0 Then
            Throw New InvalidOperationException("Cannot compute median for an empty set.")
        End If

        Dim sortedList = From number In values
                         Order By number

        Dim medianValue As Double

        Dim itemIndex = CInt(Int(sortedList.Count / 2))

        If sortedList.Count Mod 2 = 0 Then
            ' Even number of items in list.
            medianValue = ((sortedList(itemIndex) + sortedList(itemIndex - 1)) / 2)
        Else
            ' Odd number of items in list.
            medianValue = sortedList(itemIndex)
        End If

        Return medianValue
    End Function

    ' "Cast" the collection of generic items as type Double and call the 
    ' Median() method to calculate the median value.
    <Extension()>
    Function Median(Of T)(ByVal values As IEnumerable(Of T),
                          ByVal selector As Func(Of T, Double)) As Double
        Return (From element In values Select selector(element)).Median()
    End Function

End Module

En el ejemplo siguiente se muestran consultas de ejemplo que llaman a la función de agregado Median en una colección de tipo Integer y una colección de tipo Double. La consulta que llama a la función de agregado Median en la colección de tipo Double llama a la sobrecarga del método Median que acepta, como entrada, una colección de tipo Double. La consulta que llama a la función de agregado Median en la colección de tipo Integer llama a la sobrecarga genérica del método Median.

Module Module1

    Sub Main()
        Dim numbers1 = {1, 2, 3, 4, 5}

        Dim query1 = Aggregate num In numbers1 Into Median(num)

        Console.WriteLine("Median = " & query1)

        Dim numbers2 = {1.9, 2, 8, 4, 5.7, 6, 7.2, 0}

        Dim query2 = Aggregate num In numbers2 Into Median()

        Console.WriteLine("Median = " & query2)
    End Sub

End Module

Consulte también