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

Vedi anche