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