將一或多個聚合函數套用至集合。
語法
Aggregate element [As type] In collection _
[, element2 [As type2] In collection2, [...]]
[ clause ]
Into expressionList
組件
| 術語 | 定義 |
|---|---|
element |
必須的。 用來逐一查看集合元素的變數。 |
type |
選擇性。
element 的類型。 如果未指定類型,則會從 collection推斷 的element型別。 |
collection |
必須的。 參考要作的集合。 |
clause |
選擇性。 一或多個查詢子句,例如 Where 子句,以精簡查詢結果以套用匯總子句或子句。 |
expressionList |
必須的。 識別要套用至集合的聚合函數的一或多個逗號分隔表達式。 您可以將別名套用至聚合函數,以指定查詢結果的成員名稱。 如果未提供別名,則會使用聚合函數的名稱。 如需範例,請參閱本主題稍後的聚合函數一節。 |
備註
Aggregate子句可用來在查詢中包含聚合函數。 聚合函數會針對一組值執行檢查和計算,並傳回單一值。 您可以使用查詢結果類型的成員來存取計算值。 您可以使用的標準聚合函數是 All、Any、Average、、、Count、MaxLongCount、、 Min和 函Sum式。 熟悉 SQL 中匯總的開發人員熟悉這些函式。 本主題的下一節將說明它們。
聚合函數的結果會包含在查詢結果中,做為查詢結果類型的欄位。 您可以提供聚合函數結果的別名,以指定將保存匯總值的查詢結果類型成員名稱。 如果未提供別名,則會使用聚合函數的名稱。
Aggregate子句可以開始查詢,也可以包含在查詢中做為其他子句。
Aggregate如果 子句開始查詢,結果就是單一值,這是 子句中所Into指定聚合函數的結果。 如果在 子句中 Into 指定了多個聚合函數,查詢會傳回具有個別屬性的單一類型,以參考 子句中 Into 每個聚合函數的結果。
Aggregate如果 子句包含在查詢中做為其他子句,則查詢集合中傳回的類型將會有個別屬性來參考 子句中Into每個聚合函數的結果。
聚合函數
以下是可與 子句搭配 Aggregate 使用的標準聚合函數。
全部
如果集合中的所有專案都符合指定的條件,則傳 true 回 ,否則傳 false回 。 以下是一個範例:
Dim customerList1 = Aggregate order In orders
Into AllOrdersOver100 = All(order.Total >= 100)
任意
如果集合中的任何專案符合指定的條件,則傳 true 回 ,否則傳 false回 。 以下是一個範例:
Dim customerList2 = From cust In customers
Aggregate order In cust.Orders
Into AnyOrderOver500 = Any(order.Total >= 500)
平均
計算集合中所有元素的平均值,或計算集合中所有元素的提供表達式。 以下是一個範例:
Dim customerOrderAverage = Aggregate order In orders
Into Average(order.Total)
Count
計算集合中的項目數目。 您可以提供選擇性 Boolean 運算式,只計算滿足條件之集合中的元素數目。 以下是一個範例:
Dim customerOrderAfter1996 = From cust In customers
Aggregate order In cust.Orders
Into Count(order.OrderDate > #12/31/1996#)
群體
是指以 或 Group Join 子句結果分組的Group By查詢結果。 函Group式只有在 或 Group Join 子句的 Group By 子句中Into才有效。 如需詳細資訊和範例,請參閱 Group By 子句 和 Group Join 子句。
LongCount
計算集合中的項目數目。 您可以提供選擇性 Boolean 運算式,只計算滿足條件之集合中的元素數目。 以傳回結果 Long。 如需範例,請參閱 Count 聚合函數。
麥克斯
計算集合中的最大值,或計算集合中所有專案的提供表達式。 以下是一個範例:
Dim customerMaxOrder = Aggregate order In orders
Into MaxOrder = Max(order.Total)
Min
從集合計算最小值,或計算集合中所有元素提供的表達式。 以下是一個範例:
Dim customerMinOrder = From cust In customers
Aggregate order In cust.Orders
Into MinOrder = Min(order.Total)
總和
計算集合中所有元素的總和,或計算集合中所有元素的提供表達式。 以下是一個範例:
Dim customerTotals = From cust In customers
Aggregate order In cust.Orders
Into Sum(order.Total)
範例
下列範例示範如何使用 Aggregate 子句將聚合函數套用至查詢結果。
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
建立 User-Defined 聚合函數
您可以將擴充方法新增至 IEnumerable<T> 類型,以在查詢表達式中包含您自己的自定義聚合函數。 然後,您的自定義方法可以在參考聚合函數的可列舉集合上執行計算或作業。 如需擴充方法的詳細資訊,請參閱擴充方法。
例如,下列範例顯示自定義聚合函數,可計算數位集合的中位數值。 擴充方法有兩個 Median 多載。 第一個多載接受 做為輸入的類型 IEnumerable(Of Double)集合。
Median如果針對 類型的Double查詢欄位呼叫聚合函數,則會呼叫這個方法。 方法的第二個多載 Median 可以傳遞任何泛型類型。 方法的 Median 泛型多載會採用第二個參數,這個參數會參考 Func(Of T, Double) Lambda 運算式,以投影類型的值(從集合中)做為類型的 Double對應值。 然後,它會將中位數值的計算委派給方法的其他多載 Median 。 如需 Lambda 表達式的詳細資訊,請參閱 Lambda 表達式。
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
下列範例顯示範例查詢,這些查詢會呼叫 Median 類型 Integer之集合上的聚合函數,以及型 Double別的集合。 在 型Double別集合上呼叫Median聚合函數的查詢會呼叫 接受 做為輸入之 方法的多Median載。Double 在型Integer別集合上呼叫Median聚合函數的查詢會呼叫 方法的Median泛型多載。
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