Aggregate (Cláusula, Visual Basic)

Actualización: noviembre 2007

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

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

Partes

  • element
    Necesario. 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
    Necesario. Hace referencia a la colección en la que funciona.

  • clause
    Opcional. Una o más cláusulas de consulta, como una cláusula Where, que van a refinar el resultado de la consulta al que se va a aplicar la cláusula o cláusulas agregadas.

  • expressionList
    Necesario. Una o más expresiones separadas por coma 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 utiliza el nombre de la función de agregado. Para obtener ejemplos, vea la sección sobre funciones de agregado más adelante en este tema.

Comentarios

La cláusula Aggregate se puede utilizar para incluir las funciones de agregado en las consultas. Las funciones de agregado realizan comprobaciones y cálculos sobre un conjunto de valores y devuelven un valor único. Puede tener acceso al valor calculado utilizando un miembro del tipo del resultado de la consulta. Las funciones de agregado estándar que puede usar son las funciones All, Any, Average, Count, LongCount, Max, Min y Sum. Los programadores que están familiarizados con agregados en SQL, también están familiarizados con estas funciones. 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 del resultado de la consulta. Puede proporcionar un alias para que el resultado de la función de agregado especifique el nombre del miembro del tipo del resultado de la consulta que contendrá el valor agregado. Si no se proporciona ningún alias, se utiliza el nombre de la función de agregado.

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

Funciones de agregado

La lista siguiente describe las funciones de agregado estándar que se pueden utilizar con la cláusula Aggregate.

  • All
    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 cualquier elemento de la colección cumplen 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 la media de todos los elementos de la colección o calcula la expresión proporcionada para todos los elementos en 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 sólo 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
    Hace referencia a los resultados de la consulta agrupados como resultado de una cláusula Group By o Group Join La función Group sólo es válida en la cláusula Into de Group By o la cláusula Group Join Para obtener más información y ejemplos, vea Group By (Cláusula, Visual Basic) y Group Join (Cláusula, Visual Basic).

  • LongCount
    Cuenta el número de elementos de la colección. Puede proporcionar una expresión Boolean opcional para contar sólo el número de elementos de la colección que cumplen una condición. Devuelve el resultado como valor de tipo 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)
    
  • Min
    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 la expresión proporcionada para todos los elementos en 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

El ejemplo de código siguiente muestra cómo utilizar la cláusula Aggregate para aplicar funciones de agregado al resultado de una 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

Crear funciones de agregado definidas por el usuario

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

El ejemplo de código siguiente muestra una función de agregado personalizada que calcula el valor medio de una colección de números, por ejemplo. 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. La segunda sobrecarga del método Median 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 para un tipo (de una colección) como el valor correspondiente de tipo Double. Después delega el cálculo del valor medio en la otra sobrecarga del método Median. Para obtener más información sobre 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 medianAggregate As IEnumerable(Of Double)) As Double
    If medianAggregate.Count = 0 Then
      Throw New InvalidOperationException("Cannot compute median for an empty set.")
    End If

    Dim sortedList = From number In medianAggregate 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 medianAggregate As IEnumerable(Of T), _
                        ByVal selector As Func(Of T, Double)) As Double
    Return (From element In medianAggregate Select selector(element)).Median()
  End Function

End Module

El ejemplo de código siguiente muestra consultas del 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 As Integer() = New Integer() {1, 2, 3, 4, 5}

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

    Console.WriteLine("Median = " & query1)

    Dim numbers2 As Double() = New Double() {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

Vea también

Conceptos

Introducción a LINQ en Visual Basic

Referencia

Select (Cláusula, Visual Basic)

From (Cláusula, Visual Basic)

Where (Cláusula, Visual Basic)

Group By (Cláusula, Visual Basic)

Otros recursos

Consultas (Visual Basic)