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 Durchlaufen der Elemente der Auflistung verwendet wird.
type Optional. Der element-Typ. Wenn kein Typ angegeben wird, wird der Typ von element aus collection abgeleitet.
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, auf das bzw. die die Aggregatklauseln angewendet werden sollen.
expressionList Erforderlich. Ein oder mehrere 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 einzufügen. Aggregatfunktionen führen Überprüfungen und Berechnungen für einen Satz von Werten durch und geben einen einzelnen Wert zurück. Sie können auf den berechneten Wert zugreifen, indem Sie einen Member des Abfrageergebnistyps verwenden. Die Standardaggregatfunktionen, die Sie verwenden können, sind die All Funktionen , , , , , , und Any Average Count LongCount Max Min Sum . 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 Members des Abfrageergebnistyps anzugeben, der den Aggregatwert enthalten soll. Wenn kein Alias angegeben wird, wird der Name der Aggregatfunktion verwendet.

Die Aggregate -Klausel kann eine Abfrage starten oder als zusätzliche Klausel in eine Abfrage eingeschlossen werden. Wenn die Aggregate -Klausel eine Abfrage startet, ist das Ergebnis ein einzelner Wert, der das Ergebnis der in der -Klausel angegebenen Aggregatfunktion Into ist. Wenn mehr als eine Aggregatfunktion in der -Klausel angegeben Into ist, gibt die Abfrage einen einzelnen Typ mit einer separaten Eigenschaft zurück, um auf das Ergebnis jeder Aggregatfunktion in der -Klausel zu Into 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 -Klausel zu Into verweisen.

Aggregatfunktionen

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

All

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

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

Any

Gibt true zurück, wenn ein Element in der Auflistung eine angegebene Bedingung erfüllt, andernfalls 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 Durchschnitt aller Elemente in der Auflistung oder 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 bereitstellen, 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 - oder -Klausel gruppiert Group By Group Join werden. Die Group Funktion ist nur in der Into -Klausel einer - oder Group By Group Join -Klausel gültig. Weitere Informationen und Beispiele finden Sie unter Group By-Klausel und Group Join-Klausel.

LongCount

Zählt die Anzahl der Elemente in der Auflistung. Sie können einen optionalen Boolean Ausdruck bereitstellen, um nur die Anzahl der 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 maximalen Wert aus der Auflistung oder 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 aus der Auflistung oder 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 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

Das folgende Beispiel zeigt, 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 dem Typ Erweiterungsmethoden IEnumerable<T> hinzufügen. Ihre benutzerdefinierte Methode kann dann eine Berechnung oder einen Vorgang für die aufzählbare Auflistung ausführen, die auf Ihre Aggregatfunktion verwiesen hat. 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 Auflistung vom Typ IEnumerable(Of Double) . Wenn die Median Aggregatfunktion für ein Abfragefeld vom Typ aufgerufen Double wird, wird diese Methode aufgerufen. Die zweite Überladung der Median -Methode kann an jeden generischen 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 zu pro Double projectieren. Anschließend wird die Berechnung des Medianwerts an die andere Überladung der Median Methode delegiert. Weitere Informationen zu Lambdaausdrücken finden Sie unter 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 Median Aggregatfunktion für eine Auflistung vom Typ Integer und eine Auflistung vom Typ Double aufrufen. Die Abfrage, die die Median Aggregatfunktion für die Auflistung des Typs Double aufruft, ruft die Überladung der Methode Median auf, die als Eingabe eine Auflistung vom Typ Double akzeptiert. Die Abfrage, die die Median Aggregatfunktion für die Auflistung des Typs aufruft, Integer 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