Condividi tramite


Clausola Aggregate (Visual Basic)

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 utilizzata per scorrere gli elementi della raccolta.
type Opzionale. 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 operare.
clause Opzionale. Una o più clausole di query, ad esempio una Where clausola, per perfezionare il risultato della query per applicare la clausola o le clausole di aggregazione a .
expressionList Obbligatorio. Una o più espressioni delimitate da virgole 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 esempi, vedere la sezione sulle funzioni di aggregazione più avanti in questo argomento.

Osservazioni:

La Aggregate clausola può essere usata per includere funzioni di aggregazione nelle query. Le funzioni di aggregazione eseguono controlli e calcoli su un set di valori e restituiscono un singolo 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 Allfunzioni , AnyAverage, , MaxLongCountCount, , Min, e .Sum Queste funzioni hanno familiarità con gli 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 Aggregate clausola può iniziare una query oppure può essere inclusa come clausola aggiuntiva in una query. Se la Aggregate clausola inizia una query, il risultato è un singolo valore risultante dalla funzione di aggregazione specificata nella Into clausola . Se nella Into clausola 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 Into clausola . Se la Aggregate clausola 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 Into clausola .

Funzioni di aggregazione

Di seguito sono riportate le funzioni di aggregazione standard che possono essere usate con la Aggregate clausola .

Tutti

Restituisce true se tutti gli elementi dell'insieme 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)

Qualunque

Restituisce true se un elemento dell'insieme 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)

Medio

Calcola la media di tutti gli elementi nella 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 facoltativa per contare solo il numero di elementi nella raccolta che soddisfano Boolean 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#)

Gruppo

Fa riferimento ai risultati della query raggruppati come risultato di una Group By clausola o Group Join . La Group funzione è valida solo nella Into clausola di una Group By clausola 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 facoltativa per contare solo il numero di elementi nella raccolta che soddisfano Boolean una condizione. Restituisce il risultato come .Long Per un esempio, vedere la Count funzione di aggregazione.

Max

Calcola il valore massimo dalla raccolta o calcola un'espressione fornita per tutti gli elementi della raccolta. Di seguito è riportato un esempio:

Dim customerMaxOrder = Aggregate order In orders
                       Into MaxOrder = Max(order.Total)

Minuti

Calcola il valore minimo dalla raccolta o calcola un'espressione fornita 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)

Somma

Calcola la somma di tutti gli elementi nella raccolta o calcola un'espressione fornita 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 Aggregate clausola per applicare funzioni di aggregazione a un risultato della 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 User-Defined

È possibile includere funzioni di aggregazione personalizzate in un'espressione di query aggiungendo metodi di estensione al IEnumerable<T> tipo. 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. Esistono due overload del Median metodo di estensione. Il primo overload accetta, come input, una raccolta di tipo IEnumerable(Of Double). Se la Median funzione di aggregazione viene chiamata per un campo di query di tipo Double, questo metodo verrà chiamato. Il secondo overload del Median metodo può essere passato a qualsiasi tipo generico. L'overload generico del Median metodo accetta un secondo parametro che fa riferimento all'espressione Func(Of T, Double) lambda 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 Median metodo . Per altre informazioni sulle espressioni lambda, vedere Espressioni 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

Nell'esempio seguente vengono illustrate query di esempio che chiamano la Median funzione di aggregazione su una raccolta di tipo Integere una raccolta di tipo Double. La query che chiama la Median funzione di aggregazione nella raccolta di tipo Double chiama l'overload del Median metodo che accetta, come input, una raccolta di tipo Double. La query che chiama la Median funzione di aggregazione nella raccolta di tipo Integer chiama l'overload generico del Median metodo .

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

Vedere anche