Clausola Aggregate (Visual Basic)
Si applica una o più funzioni di aggregazione a una raccolta.
Sintassi
Aggregate element [As type] In collection _
[, element2 [As type2] In collection2, [...]]
[ clause ]
Into expressionList
Parti
Termine | Definizione |
---|---|
element |
Obbligatorio. Variabile usata per scorrere gli elementi della raccolta. |
type |
Facoltativo. Tipo di element . Se non viene specificato alcun tipo, il tipo di element viene dedotto da collection . |
collection |
Obbligatorio. Fa riferimento alla raccolta su cui lavorare. |
clause |
Facoltativo. Una o più clausole di query, ad esempio una clausola Where , per affinare il risultato della query a cui applicare la clausola o le clausole di aggregazione. |
expressionList |
Obbligatorio. Una o più espressioni delimitate da virgola che identificano una funzione di aggregazione da applicare alla raccolta. È possibile applicare un alias a una funzione di aggregazione per specificare un nome membro per il risultato della query. Se non viene specificato alcun alias, viene usato il nome della funzione di aggregazione. Per esempio, vedere la sezione sulle funzioni di aggregazione più avanti in questo argomento. |
Osservazioni:
La clausola Aggregate
può essere usata per includere le funzioni di aggregazione nelle query. Le funzioni di aggregazione eseguono controlli e calcoli su un set di valori e restituiscono un solo valore. È possibile accedere al valore calcolato usando un membro del tipo di risultato della query. Le funzioni di aggregazione standard che è possibile usare sono le funzioni All
, Any
, Average
, Count
, LongCount
, Max
, Min
e Sum
. Queste funzioni sono note agli sviluppatori che hanno familiarità con le aggregazioni in SQL. Sono descritte nella sezione seguente di questo argomento.
Il risultato di una funzione di aggregazione viene incluso nel risultato della query come campo del tipo di risultato della query. È possibile specificare un alias per il risultato della funzione di aggregazione per specificare il nome del membro del tipo di risultato della query che conterrà il valore aggregato. Se non viene specificato alcun alias, viene usato il nome della funzione di aggregazione.
La clausola Aggregate
può iniziare una query oppure può essere inclusa come clausola aggiuntiva in una query. Se la clausola Aggregate
inizia una query, il risultato è un singolo valore risultante dalla funzione di aggregazione specificata nella clausola Into
. Se nella clausola Into
vengono specificate più funzioni di aggregazione, la query restituisce un singolo tipo con una proprietà separata per fare riferimento al risultato di ogni funzione di aggregazione nella clausola Into
. Se la clausola Aggregate
viene inclusa come clausola aggiuntiva in una query, il tipo restituito nella raccolta di query avrà una proprietà separata per fare riferimento al risultato di ogni funzione di aggregazione nella clausola Into
.
Funzioni di aggregazione
Di seguito sono riportate le funzioni di aggregazione standard che possono essere usate con la clausola Aggregate
.
Tutte le date
Restituisce true
se tutti gli elementi della raccolta soddisfano una condizione specificata; in caso contrario, restituisce false
. Di seguito è riportato un esempio:
Dim customerList1 = Aggregate order In orders
Into AllOrdersOver100 = All(order.Total >= 100)
Any
Restituisce true
se un elemento della raccolta soddisfa una condizione specificata; in caso contrario, restituisce false
. Di seguito è riportato un esempio:
Dim customerList2 = From cust In customers
Aggregate order In cust.Orders
Into AnyOrderOver500 = Any(order.Total >= 500)
Media
Calcola la media di tutti gli elementi della raccolta o calcola un'espressione fornita per tutti gli elementi della raccolta. Di seguito è riportato un esempio:
Dim customerOrderAverage = Aggregate order In orders
Into Average(order.Total)
Conteggio
Conta il numero di elementi nella raccolta. È possibile fornire un'espressione Boolean
facoltativa per contare solo il numero di elementi nella raccolta che soddisfano una condizione. Di seguito è riportato un esempio:
Dim customerOrderAfter1996 = From cust In customers
Aggregate order In cust.Orders
Into Count(order.OrderDate > #12/31/1996#)
Raggruppa
Fa riferimento ai risultati della query raggruppati come risultato di una clausola Group By
o Group Join
. La funzione Group
è valida solo nella clausola Into
di una clausola Group By
o Group Join
. Per altre informazioni ed esempi, vedere Clausola Group By e Clausola Group Join.
LongCount
Conta il numero di elementi nella raccolta. È possibile fornire un'espressione Boolean
facoltativa per contare solo il numero di elementi nella raccolta che soddisfano una condizione. Restituisce il risultato come Long
. Per un esempio, vedere la funzione di aggregazione Count
.
Max
Calcola il valore massimo della raccolta o calcola un'espressione specificata per tutti gli elementi della raccolta. Di seguito è riportato un esempio:
Dim customerMaxOrder = Aggregate order In orders
Into MaxOrder = Max(order.Total)
Min
Calcola il valore minimo della raccolta o calcola un'espressione specificata per tutti gli elementi della raccolta. Di seguito è riportato un esempio:
Dim customerMinOrder = From cust In customers
Aggregate order In cust.Orders
Into MinOrder = Min(order.Total)
Sum
Calcola la somma di tutti gli elementi della raccolta o calcola un'espressione specificata per tutti gli elementi della raccolta. Di seguito è riportato un esempio:
Dim customerTotals = From cust In customers
Aggregate order In cust.Orders
Into Sum(order.Total)
Esempio
Nell'esempio seguente viene illustrato come usare la clausola Aggregate
per applicare le funzioni di aggregazione al risultato di una query.
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
Creazione di funzioni di aggregazione definite dall'utente
È possibile includere le proprie funzioni di aggregazione personalizzate in un'espressione di query aggiungendo metodi di estensione al tipo IEnumerable<T>. Il metodo personalizzato può quindi eseguire un calcolo o un'operazione sulla raccolta enumerabile che ha fatto riferimento alla funzione di aggregazione. Per altre informazioni sui metodi di estensione, vedere Metodi di estensione.
Nell'esempio seguente viene ad esempio illustrata una funzione di aggregazione personalizzata che calcola il valore mediano di una raccolta di numeri. Vi sono due overload del metodo di estensione Median
. Il primo overload accetta, come input, una raccolta di tipo IEnumerable(Of Double)
. Se per un campo di query di tipo Double
viene chiamata la funzione di aggregazione Median
, viene chiamato questo metodo. Per il secondo overload del metodo Median
, può essere usato qualsiasi tipo generico. L'overload generico del metodo Median
accetta un secondo parametro che fa riferimento all'espressione lambda Func(Of T, Double)
per proiettare un valore per un tipo (da una raccolta) come valore corrispondente di tipo Double
. Delega quindi il calcolo del valore mediano all'altro overload del metodo Median
. Per altre informazioni sulle espressioni lambda, vedere Espressioni lambda in C++.
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
Nell'esempio seguente vengono illustrate query di esempio che chiamano la funzione di aggregazione Median
su una raccolta di tipo Integer
e una raccolta di tipo Double
. La query che chiama la funzione di aggregazione Median
nella raccolta di tipo Double
chiama l'overload del metodo Median
che accetta, come input, una raccolta di tipo Double
. La query che chiama la funzione di aggregazione Median
nella raccolta di tipo Integer
chiama l'overload generico del metodo 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