Aggregate-Klausel (Visual Basic)

Wendet eine Aggregatfunktion 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 für die Iteration durch die Elemente der Auflistung.
type Optional. Der element-Typ. Wenn kein Typ angegeben ist, wird der Typ von element aus collection abgeleitet.
collection Erforderlich. Gibt die Auflistung an, auf der die Ausführung erfolgen soll.
clause Optional. Mindestens eine Abfrageklausel, z. B. eine Where-Klausel, zum Verfeinern des Abfrageergebnisses, auf den die Aggregate-Klauseln angewendet werden sollen.
expressionList Erforderlich. Ein Ausdruck oder mehrere durch Komma voneinander getrennte Ausdrücke zum Identifizieren einer Aggregatfunktion, die auf die Auflistung angewendet werden soll. Sie können einen Alias auf eine Aggregatfunktion anwenden, um einen Membernamen für das Abfrageergebnis festzulegen. Wenn Sie keinen Alias angegeben, wird der Name der Aggregatfunktion verwendet. Beispiele finden Sie im Abschnitt zu Aggregatfunktionen weiter unten in diesem Artikel.

Bemerkungen

Mit der Aggregate-Klausel können Sie Aggregatfunktionen in Ihre Abfragen einfügen. Aggregatfunktionen führen Überprüfungen und Berechnungen für einen Satz an Werten aus und geben einen einzelnen Wert zurück. Für den Zugriff auf den berechneten Wert können Sie ein Member des Abfrageergebnistyps verwenden. Die standardmäßigen Aggregatfunktionen, die Ihnen zur Verfügung stehen, sind die Funktionen All, Any, Average, Count, LongCount, Max, Min und Sum. Entwickler, die Aggregate von SQL kennen, sind mit diesen Funktionen bereits vertraut. Sie werden im folgenden Abschnitt dieses Artikels beschrieben.

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

Die Aggregate-Klausel kann eine Abfrage starten oder als zusätzliche Klausel in eine Abfrage eingefügt werden. Wenn die Aggregate-Klausel eine Abfrage startet, ist das Ergebnis ein einzelner Wert, der das Ergebnis der in der Into-Klausel festgelegten Aggregatfunktion ist. Wenn in der Into-Klausel mehrere Aggregatfunktionen festgelegt sind, gibt die Abfrage einen einzelnen Typ mit einer separaten Eigenschaft zurück, die auf das Ergebnis der einzelnen Aggregatfunktionen in der Into-Klausel verweist. Wenn die Aggregate-Klausel als zusätzliche Klausel in eine Abfrage eingefügt wird, weist der in der Abfrageauflistung zurückgegebene Typ eine separate Eigenschaft auf, die auf das Ergebnis der einzelnen Aggregatfunktion in der Into-Klausel verweist.

Aggregatfunktionen

Nachfolgend finden Sie die standardmäßigen Aggregatfunktionen, die Sie mit der Aggregate-Klausel verwenden können.

All

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

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

Any

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

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

Average

Berechnet den Durchschnitt 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 Element in der Auflistung. Sie können optional einen Boolean-Ausdruck angeben, um nur die 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#)

Group

Verweist auf Abfrageergebnisse, die als Ergebnis einer Group By- oder Group Join-Klausel gruppiert werden. Die Funktion Group ist nur in der Into-Klausel von einer Group By- oder Group Join-Klausel gültig. Weitere Informationen und Beispiele finden Sie unter Group-By-Klausel und Group-Join-Klausel.

LongCount

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

Max

Berechnet den Höchstwert 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 Minimalwert 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 Sie mit der Aggregate-Klausel Aggregatfunktionen auf ein Abfrageergebnis anwenden.

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 von benutzerdefinierten Aggregatfunktionen

Sie können eigene benutzerdefinierte Aggregatfunktionen in einen Abfrageausdruck einfügen, indem Sie Erweiterungsmethoden zum IEnumerable<T>-Typ hinzufügen. Die benutzerdefinierte Methode kann dann eine Berechnung oder Operation auf der aufzählbaren Auflistung ausführen, in der auf die Aggregatfunktion verwiesen wird. Weitere Informationen zu Erweiterungsmethoden finden Sie unter Extension Methods (Erweiterungsmethoden).

Das folgende Beispiel zeigt eine benutzerdefinierte Aggregatfunktion, die den Median einer Auflistung von Zahlen berechnet. Es gibt zwei Überladungen der Median-Erweiterungsmethode. Die erste Überladung akzeptiert als Eingabe eine Auflistung des Typs IEnumerable(Of Double). Wenn die Aggregatfunktion Median für ein Abfragefeld des Typs Double aufgerufen wird, wird diese Methode aufgerufen. Der zweiten Überladung der Median-Methode kann jeder generische Typ übergeben werden. Die generische Überladung der Median-Methode hat einen zweiten Parameter, der auf den Lambdaausdruck Func(Of T, Double) verweist, um einen Wert für einen Typ (aus einer Auflistung) als entsprechenden Wert des Typs Double zu projizieren. Anschließend wird die Berechnung des Median an die andere Überladung der Median-Methode delegiert. Weitere Informationen zu Lambdaausdrücken finden Sie unter Lambda Expressions (Lambdaausdrü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

Das folgende Beispiel zeigt Beispielabfragen, die die Aggregatfunktion Median auf einer Auflistung des Typs Integer und einer Auflistung des Typs Double aufrufen. Die Abfrage, die die Aggregatfunktion Median auf der Auflistung des Typs Double aufruft, ruft die Überladung der Median-Methode auf, die als Eingabe eine Auflistung von Typ Double akzeptiert. Die Abfrage, die die Aggregatfunktion Median auf der Auflistung des Typs Integer aufruft, ruft die 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