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