Aggregate-Klausel (Visual Basic)

Aktualisiert: November 2007

Wendet eine oder mehrere Aggregatfunktionen auf eine Auflistung an.

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

Bestandteile

  • element
    Erforderlich. Eine Variable, die zum Durchlaufen der Elemente der Auflistung verwendet wird.

  • type
    Optional. Der Typ von element. Wenn kein Typ angegeben ist, wird der Typ von element von collection abgeleitet.

  • collection
    Erforderlich. Bezeichnet die zu bearbeitende Auflistung.

  • clause
    Optional. Eine oder mehrere Abfrageklauseln (z. B. eine Where-Klausel) zum Verfeinern des Abfrageergebnisses, auf das die Aggregate-Klausel oder -Klauseln angewendet werden.

  • expressionList
    Erforderlich. Ein oder mehrere durch Trennzeichen getrennte Ausdrücke, die eine Aggregatfunktion angeben, die auf die Auflistung angewendet wird. Sie können für eine Aggregatfunktion einen Alias angeben, um einen Membernamen für das Abfrageergebnis festzulegen. Wenn Sie keinen Alias angeben, wird der Name der Aggregatfunktion verwendet. Beispiele finden Sie weiter unten in diesem Thema im Abschnitt über Aggregatfunktionen.

Hinweise

Mit der Aggregate-Klausel können Sie in Abfragen Aggregatfunktionen angeben. Aggregatfunktionen führen für einen Satz von Werten Überprüfungen und Berechnungen aus und geben einen einzelnen Wert zurück. Sie können mithilfe eines Members des Abfrageergebnistyps auf den berechneten Wert zugreifen. Sie können die folgenden Standardaggregatfunktionen verwenden: All, Any, Average, Count, LongCount, Max, Min und Sum. Entwicklern, die sich mit Aggregaten in SQL auskennen, sollten diese Funktionen vertraut sein. Sie werden im folgenden Abschnitt dieses Themas beschrieben.

Das Ergebnis einer Aggregatfunktion wird im Abfrageergebnis als Feld des Abfrageergebnistyps aufgenommen. Sie können für das Ergebnis der Aggregatfunktion einen Alias angeben, um den Namen des Members des Abfrageergebnistyps festzulegen, der den Aggregatwert aufnimmt. Wenn Sie keinen Alias angeben, wird der Name der Aggregatfunktion verwendet.

Die Aggregate-Klausel kann eine Abfrage einleiten oder in einer Abfrage als zusätzliche Klausel angegeben werden. Wenn die Aggregate-Klausel eine Abfrage einleitet, besteht das Ergebnis aus einem einzelnen Wert, der das Ergebnis der in der Into-Klausel angegebenen Aggregatfunktion ist. Wenn in der Into-Klausel mehrere Aggregatfunktionen angegeben werden, wird von der Abfrage ein einzelner Typ mit einer separaten Eigenschaft zurückgegeben, die auf das Ergebnis der einzelnen Aggregatfunktionen in der Into-Klausel verweist. Wenn die Aggregate-Klausel in einer Abfrage als zusätzliche Klausel angegeben wird, verfügt der in der Abfrageauflistung zurückgegebene Typ über eine separate Eigenschaft, die auf das Ergebnis der einzelnen Aggregatfunktionen in der Into-Klausel verweist.

Aggregatfunktionen

In der folgenden Liste werden die Standardaggregatfunktionen beschrieben, die Sie in der Aggregate-Klausel verwenden können.

  • All
    Gibt true zurück, wenn alle Elemente in der Auflistung eine angegebene Bedingung erfüllen, andernfalls false. Beachten Sie folgendes 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. Beachten Sie folgendes 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 für alle Elemente in der Auflistung einen angegebenen Ausdruck. Beachten Sie folgendes Beispiel:

    Dim customerOrderAverage = Aggregate order In orders _
                               Into Average(order.Total)
    
  • Count
    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. Beachten Sie folgendes 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-Klausel oder einer Group Join-Klausel gruppiert werden. Die Group-Funktion ist nur in der Into-Klausel einer Group By-Klausel oder einer Group Join-Klausel gültig. Weitere Informationen und Beispiele finden Sie unter GROUP BY-Klausel (Visual Basic) und Group Join-Klausel (Visual Basic).

  • 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 Long zurück. Ein Beispiel finden Sie unter der Count-Aggregatfunktion.

  • Max
    Berechnet den maximalen Wert in der Auflistung, oder berechnet für alle Elemente in der Auflistung einen angegebenen Ausdruck. Beachten Sie folgendes Beispiel:

    Dim customerMaxOrder = Aggregate order In orders _
                           Into MaxOrder = Max(order.Total)
    
  • Min
    Berechnet den minimalen Wert in der Auflistung, oder berechnet für alle Elemente in der Auflistung einen angegebenen Ausdruck. Beachten Sie folgendes 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 für alle Elemente in der Auflistung einen angegebenen Ausdruck. Beachten Sie folgendes Beispiel:

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

Beispiel

Im folgenden Codebeispiel wird veranschaulicht, 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 von benutzerdefinierten Aggregatfunktionen

Sie können in einem Abfrageausdruck eigene benutzerdefinierte Aggregatfunktionen verwenden, indem Sie dem IEnumerable<T>-Typ Erweiterungsmethoden hinzufügen. Die benutzerdefinierte Methode kann dann eine Berechnung oder Operation für die aufzählbare Auflistung durchführen, die auf Ihre Aggregatfunktion verweist. Weitere Informationen über Erweiterungsmethoden finden Sie unter Erweiterungsmethoden (Visual Basic).

Das folgende Codebeispiel enthält beispielsweise 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). Diese Methode wird aufgerufen, wenn die Median-Aggregatfunktion für ein Abfragefeld des Typs Double aufgerufen wird. Der zweiten Überladung der Median-Methode kann ein beliebiger generischer Typ übergeben werden. Die generische Überladung der Median-Methode nimmt einen zweiten Parameter entgegen, der auf den Func(Of T, Double)-Lambdaausdruck verweist, um einen Wert für einen Typ (aus einer Auflistung) auf den entsprechenden Wert des Typs Double zu projizieren. Anschließend wird die Berechnung des Medians an die andere Überladung der Median-Methode delegiert. Weitere Informationen zu Lambdaausdrü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 medianAggregate As IEnumerable(Of Double)) As Double
    If medianAggregate.Count = 0 Then
      Throw New InvalidOperationException("Cannot compute median for an empty set.")
    End If

    Dim sortedList = From number In medianAggregate 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 medianAggregate As IEnumerable(Of T), _
                        ByVal selector As Func(Of T, Double)) As Double
    Return (From element In medianAggregate Select selector(element)).Median()
  End Function

End Module

Das folgende Codebeispiel enthält Beispielabfragen, die die Median-Aggregatfunktion für eine Auflistung des Typs Integer und eine Auflistung des Typs Double aufrufen. Bei der Abfrage, die die Median-Aggregatfunktion für die Auflistung des Typs Double aufruft, wird die Überladung der Median-Methode aufgerufen, die als Eingabe eine Auflistung des Typs Double akzeptiert. Bei der Abfrage, die die Median-Aggregatfunktion für die Auflistung des Typs Integer aufruft, wird die generische Überladung der Median-Methode aufgerufen.

Module Module1

  Sub Main()
    Dim numbers1 As Integer() = New Integer() {1, 2, 3, 4, 5}

    Dim query1 = Aggregate num In numbers1 Into Median(num)

    Console.WriteLine("Median = " & query1)

    Dim numbers2 As Double() = New Double() {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

Konzepte

Einführung in LINQ in Visual Basic

Referenz

Select-Klausel (Visual Basic)

From-Klausel (Visual Basic)

Where-Klausel (Visual Basic)

GROUP BY-Klausel (Visual Basic)

Weitere Ressourcen

Abfragen (Visual Basic)