Freigeben über


Aggregatklausel (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 Durchlaufen der Elemente der Auflistung verwendet wird.
type Wahlfrei. Der element-Typ. Wenn kein Typ angegeben ist, wird der Typ von elementcollection.
collection Erforderlich. Bezieht sich auf die Auflistung, die ausgeführt werden soll.
clause Wahlfrei. Eine oder mehrere Abfrageklauseln, z. B. eine Where Klausel, um das Abfrageergebnis zu verfeinern, um die Aggregatklausel oder -klauseln anzuwenden.
expressionList Erforderlich. Mindestens ein durch Trennzeichen 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 weiter unten in diesem Thema.

Bemerkungen

Die Aggregate Klausel kann verwendet werden, um Aggregatfunktionen in Ihre Abfragen einzuschließen. Aggregatfunktionen führen Überprüfungen und Berechnungen über eine Gruppe 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 standardmäßigen Aggregatfunktionen, die Sie verwenden können, sind die All, Any, , Average, Count, LongCount, Maxund MinSum 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 Ergebnis der Aggregatfunktion angeben, um den Namen des Elements 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 eingeschlossen werden. Wenn die Aggregate Klausel eine Abfrage beginnt, ist das Ergebnis ein einzelner Wert, der das Ergebnis der in der Into Klausel angegebenen Aggregatfunktion ist. Wenn mehr als eine Aggregatfunktion in der Into Klausel angegeben wird, gibt die Abfrage einen einzelnen Typ mit einer separaten Eigenschaft zurück, um auf das Ergebnis jeder Aggregatfunktion in der Into Klausel zu verweisen. Wenn die Aggregate Klausel als zusätzliche Klausel in einer Abfrage enthalten ist, verfügt der in der Abfrageauflistung zurückgegebene Typ über eine separate Eigenschaft, um auf das Ergebnis jeder Aggregatfunktion in der Into Klausel zu verweisen.

Aggregatfunktionen

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

Alle

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)

Beliebig

Gibt zurück true , wenn ein beliebiges 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)

Durchschnitt

Berechnet den Mittelwert aller Elemente in der Auflistung oder berechnet einen bereitgestellten 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#)

Gruppe

Bezieht sich auf Abfrageergebnisse, die als Ergebnis einer Group By Oder-Klausel Group Join gruppiert sind. Die Group Funktion ist nur in der Into Klausel eines oder Group Join einer Group By 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 in der Count Aggregatfunktion.

Max.

Berechnet den Maximalwert aus der Auflistung oder berechnet einen bereitgestellten 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 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)

Summe

Berechnet die Summe aller Elemente in der Auflistung oder berechnet einen bereitgestellten 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

Das folgende Beispiel zeigt, wie Sie die Aggregate Klausel verwenden, 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 eigene benutzerdefinierte Aggregatfunktionen in einen Abfrageausdruck einschließen, indem Sie dem IEnumerable<T> Typ Erweiterungsmethoden hinzufügen. Ihre benutzerdefinierte Methode kann dann eine Berechnung oder einen Vorgang für die aufzählbare Auflistung ausführen, auf die die Aggregatfunktion verwiesen wurde. Weitere Informationen zu Erweiterungsmethoden finden Sie unter Extension Methods (Erweiterungsmethoden).

Das folgende Beispiel zeigt beispielsweise eine benutzerdefinierte Aggregatfunktion, die den Medianwert einer Auflistung von Zahlen berechnet. Es gibt zwei Überladungen der Median Erweiterungsmethode. Die erste Überladung akzeptiert als Eingabe eine Sammlung vom Typ IEnumerable(Of Double). Wenn die Median Aggregatfunktion für ein Abfragefeld vom Typ Doubleaufgerufen wird, wird diese Methode aufgerufen. Die zweite Überladung der Median Methode kann einen beliebigen generischen Typ übergeben werden. Die generische Überladung der Median Methode verwendet einen zweiten Parameter, der auf den Func(Of T, Double) Lambda-Ausdruck 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

Das folgende Beispiel zeigt Beispielabfragen, die die Median Aggregatfunktion für eine Sammlung vom Typ Integeraufrufen, und eine Auflistung vom Typ Double. Die Abfrage, die die Median Aggregatfunktion für die Sammlung des Typs Double aufruft, ruft die Überladung der Methode auf, die Median als Eingabe eine Sammlung vom Typ Doubleakzeptiert. Die Abfrage, die die Median Aggregatfunktion für die Sammlung 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

Siehe auch