Compartir a través de


Cláusula Aggregate (Visual Basic)

Aplica una o varias 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 usada 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 Obligatorio. Hace referencia a la colección en la que se va a operar.
clause Opcional. Una o varias cláusulas de consulta, como una Where cláusula , para refinar el resultado de la consulta para aplicar la cláusula o cláusulas de agregado a .
expressionList Obligatorio. 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 las funciones de agregado más adelante en este tema.

Observaciones

La Aggregate cláusula 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 único valor. 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 las Allfunciones , Any, CountAverage, LongCount, , Max, , Miny Sum . Estas funciones son conocidas para los desarrolladores que están familiarizados con los agregados en SQL. Se describen en la siguiente sección de este tema.

El resultado de una función de agregado se incluye en el resultado de la consulta como un campo del tipo de resultado de la consulta. Puede proporcionar un alias para el resultado de la función de agregado para 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 Aggregate cláusula puede iniciar una consulta o se puede incluir como una cláusula adicional en una consulta. Si la Aggregate cláusula comienza una consulta, el resultado es un valor único que es el resultado de la función de agregado especificada en la Into cláusula . Si se especifica más de una función de agregado en la Into cláusula , la consulta devuelve un solo tipo con una propiedad independiente para hacer referencia al resultado de cada función de agregado en la Into cláusula . Si la Aggregate cláusula se incluye como una 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 Into cláusula .

Funciones de agregado

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

Todos

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)

Cualquiera

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)

Promedio

Calcula el promedio de todos los elementos de la colección o calcula 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)

Contar

Cuenta el número de elementos de la colección. Puede proporcionar una expresión opcional Boolean 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#)

Grupo

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

LongCount

Cuenta el número de elementos de la colección. Puede proporcionar una expresión opcional Boolean 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, consulte la Count función de agregado.

Máx.

Calcula el valor máximo de la colección o calcula 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)

Minuto

Calcula el valor mínimo de la colección o calcula 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)

Suma

Calcula la suma de todos los elementos de la colección o calcula 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 Aggregate cláusula 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 de User-Defined

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

Por ejemplo, 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 Median extensión. La primera sobrecarga acepta, como entrada, una colección de tipo IEnumerable(Of Double). Si se llama a la Median función de agregado para un campo de consulta de tipo Double, se llamará a este método. La segunda sobrecarga del Median método se puede pasar a cualquier tipo genérico. La sobrecarga genérica del Median método toma un segundo parámetro que hace referencia a la Func(Of T, Double) expresión lambda para proyectar un valor para un tipo (de una colección) como el valor correspondiente del tipo Double. A continuación, delega el cálculo del valor medio a la otra sobrecarga del Median método. 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 Median función de agregado en una colección de tipo Integery una colección de tipo Double. La consulta que llama a la Median función de agregado en la colección de tipo Double llama a la Median sobrecarga del método que acepta, como entrada, una colección de tipo Double. La consulta que llama a la Median función de agregado en la colección de tipo Integer llama a la sobrecarga genérica del Median método .

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