Aggregate-Klausel (Visual Basic)

Wendet eine oder mehrere Aggregatfunktionen auf eine Auflistung an.

Syntax

Aggregate element [As type] In collection _  
  [, element2 [As type2] In collection2, [...]]  
  [ clause ]  
  Into expressionList  

Bestandteile

Begriff Definition
element Erforderlich. Variable, die zum Iterieren durch die Elemente der Auflistung verwendet wird.
type Optional. Der element-Typ. Wenn kein Typ angegeben wird, wird der Typ element von collection.
collection Erforderlich. Bezieht sich auf die Auflistung, die ausgeführt werden soll.
clause Optional. Eine oder mehrere Abfrageklauseln, z. B. eine Where Klausel, um das Abfrageergebnis zu verfeinern, um die aggregierte Klausel oder Klauseln anzuwenden.
expressionList Erforderlich. Ein oder mehrere durch Komma getrennte Ausdrücke, die eine Aggregatfunktion identifizieren, die auf die Auflistung angewendet werden soll. Sie können einen Alias auf eine Aggregatfunktion anwenden, um einen Membernamen für das Abfrageergebnis anzugeben. Wenn kein Alias angegeben wird, wird der Name der Aggregatfunktion verwendet. Beispiele finden Sie im Abschnitt zu Aggregatfunktionen später in diesem Thema.

Hinweise

Die Aggregate Klausel kann verwendet werden, um aggregierte Funktionen in Ihre Abfragen einzuschließen. Aggregatfunktionen führen Prüfungen und Berechnungen über einen Satz von Werten aus und geben einen einzelnen Wert zurück. Sie können auf den berechneten Wert zugreifen, indem Sie ein Element des Abfrageergebnistyps verwenden. Die Standardaggregatfunktionen, die Sie verwenden können, sind die All, CountLongCountAverageMaxAnyMinund Sum Funktionen. Diese Funktionen sind Entwicklern vertraut, die mit Aggregaten in SQL vertraut sind. Sie werden im folgenden Abschnitt dieses Themas beschrieben.

Das Ergebnis einer Aggregatfunktion ist im Abfrageergebnis als Feld des Abfrageergebnistyps enthalten. Sie können einen Alias für das Aggregatfunktionsergebnis angeben, um den Namen des Members des Abfrageergebnistyps anzugeben, der den Aggregatwert enthält. Wenn kein Alias angegeben wird, wird der Name der Aggregatfunktion verwendet.

Die Aggregate Klausel kann eine Abfrage beginnen oder als zusätzliche Klausel in eine Abfrage einbezogen werden. Wenn die Klausel eine Abfrage beginnt, ist das Aggregate Ergebnis ein einzelner Wert, der das Ergebnis der in der Into Klausel angegebenen Aggregatfunktion ist. Wenn mehr als eine Aggregatfunktion in der Klausel angegeben wird, gibt die Abfrage einen einzelnen Typ mit einer separaten Eigenschaft zurück, um auf das Ergebnis jeder Aggregatfunktion in der IntoInto Klausel zu verweisen. Wenn die Aggregate Klausel als zusätzliche Klausel in einer Abfrage enthalten ist, hat der typ, der in der Abfragesammlung zurückgegeben wird, eine separate Eigenschaft, um auf das Ergebnis der einzelnen Aggregatfunktionen in der Into Klausel zu verweisen.

Aggregatfunktionen

Im Folgenden finden Sie die Standardaggregatfunktionen, die mit der Aggregate Klausel verwendet werden können.

All

Gibt zurück true , wenn alle Elemente in der Auflistung eine angegebene Bedingung erfüllen; andernfalls wird zurückgegeben false. Es folgt ein Beispiel:

Dim customerList1 = Aggregate order In orders
                    Into AllOrdersOver100 = All(order.Total >= 100)

Any

Gibt zurück true , wenn ein Element in der Auflistung eine angegebene Bedingung erfüllt; andernfalls wird zurückgegeben false. Es folgt ein Beispiel:

Dim customerList2 = From cust In customers
                    Aggregate order In cust.Orders
                    Into AnyOrderOver500 = Any(order.Total >= 500)

Average

Berechnet den Mittelwert aller Elemente in der Auflistung oder berechnet einen angegebenen Ausdruck für alle Elemente in der Auflistung. Es folgt ein Beispiel:

Dim customerOrderAverage = Aggregate order In orders
                           Into Average(order.Total)

Anzahl

Zählt die Anzahl der Elemente in der Auflistung. Sie können einen optionalen Boolean Ausdruck angeben, um nur die Anzahl der Elemente in der Auflistung zu zählen, die eine Bedingung erfüllen. Es folgt ein Beispiel:

Dim customerOrderAfter1996 = From cust In customers
                             Aggregate order In cust.Orders
                             Into Count(order.OrderDate > #12/31/1996#)

Gruppieren

Bezieht sich auf Abfrageergebnisse, die als Ergebnis einer Group By oder Group Join Klausel gruppiert sind. Die Group Funktion ist nur in der Into Klausel eines Group By oder Group Join einer Klausel gültig. Weitere Informationen und Beispiele finden Sie unter "Group By Clause " und "Group Join Clause".

LongCount

Zählt die Anzahl der Elemente in der Auflistung. Sie können einen optionalen Boolean Ausdruck angeben, um nur die Anzahl der Elemente in der Auflistung zu zählen, die eine Bedingung erfüllen. Gibt das Ergebnis als ein Long. Ein Beispiel finden Sie unter der Count Aggregatfunktion.

Max

Berechnet den maximalen Wert aus der Auflistung oder berechnet einen angegebenen Ausdruck für alle Elemente in der Auflistung. Es folgt ein Beispiel:

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

Min

Berechnet den Mindestwert aus der Auflistung oder berechnet einen angegebenen Ausdruck für alle Elemente in der Auflistung. Es folgt ein Beispiel:

Dim customerMinOrder = From cust In customers
                       Aggregate order In cust.Orders
                       Into MinOrder = Min(order.Total)

Sum

Berechnet die Summe aller Elemente in der Auflistung oder berechnet einen angegebenen Ausdruck für alle Elemente in der Auflistung. Es folgt ein Beispiel:

Dim customerTotals = From cust In customers
                     Aggregate order In cust.Orders
                     Into Sum(order.Total)

Beispiel

Im folgenden Beispiel wird gezeigt, wie die Aggregate Klausel verwendet wird, um Aggregatfunktionen auf ein Abfrageergebnis anzuwenden.

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

Erstellen User-Defined Aggregatfunktionen

Sie können ihre eigenen benutzerdefinierten Aggregatfunktionen in einen Abfrageausdruck einschließen, indem Sie erweiterungsmethoden zum IEnumerable<T> Typ hinzufügen. Ihre benutzerdefinierte Methode kann dann eine Berechnung oder einen Vorgang in der aufgezählten Auflistung ausführen, die auf Ihre Aggregatfunktion verwiesen hat. Weitere Informationen zu Erweiterungsmethoden finden Sie unter Extension Methods (Erweiterungsmethoden).

Im folgenden Beispiel wird beispielsweise eine benutzerdefinierte Aggregatfunktion gezeigt, die den Medianwert einer Auflistung von Zahlen berechnet. Es gibt zwei Überladungen der Median Erweiterungsmethode. Die erste Überladung akzeptiert als Eingabe eine Sammlung von Typ IEnumerable(Of Double). Wenn die Median Aggregatfunktion für ein Abfragefeld des Typs Doubleaufgerufen wird, wird diese Methode aufgerufen. Die zweite Überladung der Median Methode kann ein beliebiger generischer Typ übergeben werden. Die generische Überladung der Median Methode verwendet einen zweiten Parameter, der auf den Func(Of T, Double) Lambdaausdruck verweist, um einen Wert für einen Typ (aus einer Auflistung) als entsprechenden Wert des Typs Doublezu projizieren. Anschließend wird die Berechnung des Medianwerts an die andere Überladung der Median Methode delegiert. Weitere Informationen zu Lambda-Ausdrücken finden Sie unter Lambda-Ausdrücke.

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

Im folgenden Beispiel werden Beispielabfragen gezeigt, die die Median Aggregatfunktion in einer Auflistung des Typs und eine Auflistung des Typs IntegerDoubleaufrufen. Die Abfrage, die die Aggregatfunktion auf der Auflistung des Typs Double aufruft, ruft die Median Überladung der Methode auf, die als Eingabe eine Auflistung des Median Typs Doubleakzeptiert. Die Abfrage, die die Aggregatfunktion auf der Auflistung des Typs Integer aufruft, ruft die Median generische Überladung der Median Methode auf.

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

Weitere Informationen