Aggregate (Cláusula, 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 |
Necesario. Hace referencia a la colección en la que se opera. |
clause |
Opcional. Una o varias cláusulas de consulta, como una cláusula , para refinar el resultado de la consulta a la que aplicar la cláusula Where o cláusulas de agregado. |
expressionList |
Necesario. Una o varias expresiones delimitadas por comas que identifican una función de agregado que se 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, vea la sección sobre las funciones de agregado más adelante en este tema. |
Comentarios
La Aggregate cláusula se puede usar para incluir 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 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 funciones All , , , , , , y Any Average Count LongCount Max Min Sum . Estas funciones son familiares para los desarrolladores que están familiarizados con 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 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 consulta que contendrán 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 comenzar una consulta o puede incluirse como una cláusula adicional en una consulta. Si la cláusula comienza una consulta, el resultado es un valor único que es el resultado de la función de agregado Aggregate especificada en la cláusula Into . Si se especifica más de una función de agregado en la cláusula , la consulta devuelve un tipo único con una propiedad independiente para hacer referencia al resultado de cada función de agregado Into en la Into cláusula . Si la 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 Aggregate la Into cláusula .
Funciones de agregado
Las siguientes son las funciones de agregado estándar que se pueden usar con la Aggregate cláusula .
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 algún elemento de la colección satisface 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 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)
Count
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 Group Join o . La Group función solo es válida en la cláusula de una cláusula o Into Group By Group Join . Para obtener más información y ejemplos, vea Group By Clause y Group Join Clause.
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, vea la Count función de agregado.
Max
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)
Min
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)
Sum
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
Crear User-Defined funciones de agregado
Puede incluir sus propias funciones de agregado personalizadas en una expresión de consulta agregando métodos de extensión al IEnumerable<T> tipo . A continuación, el método personalizado puede realizar un cálculo u operación en la colección enumerable a la que se ha hecho 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 Median de extensión. La primera sobrecarga acepta, como entrada, una colección de tipo IEnumerable(Of Double) . Si se Median llama a la función de agregado para un campo de consulta de tipo , se Double 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 método toma un segundo parámetro que hace referencia a la expresión lambda para proyectar un valor para un tipo (de una colección) como Median el valor correspondiente de tipo Func(Of T, Double) Double . A continuación, delega el cálculo del valor medio en 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 función de agregado en una colección de Median tipo y una colección de tipo Integer Double . La consulta que llama a la función de agregado en la colección de tipo llama a la sobrecarga del método que acepta, como Median Double Median entrada, una colección de tipo Double . La consulta que llama a la Median función de agregado en la colección de tipo llama a la sobrecarga genérica del método Integer 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