Aggregate 子句 (Visual Basic)
更新:2007 年 11 月
將一個或多個彙總函式 (Aggregate Function) 套用至集合。
Aggregate element [As type] In collection _
[, element2 [As type2] In collection2, [...]]
[ clause ]
Into expressionList
參數
element
必要項。用來逐一查看集合項目的變數。type
選擇項,element 的型別。如果未指定型別,則會從 collection 推斷 element 的型別。collection
必要項。參考要操作的集合。clause
選擇項,一個或多個查詢子句,例如 Where 子句,以限定套用 Aggregate 子句的查詢結果。expressionList
必要項。一個或多個以逗號分隔的運算式,會識別套用至集合的彙總函式。您可以將別名 (Alias) 套用至彙總函式以指定查詢結果的成員名稱。如果未提供別名,則會使用彙總函式的名稱。如需範例,請參閱本主題稍後關於彙總函式的章節。
備註
Aggregate 子句可以用來將彙總函式包含在查詢中。彙總函式會對值集執行檢查及計算,並傳回單一值。您可以使用查詢結果型別的成員來存取計算值。您可以使用的標準彙總函式為 All, Any、Average、Count、LongCount、Max、Min 及 Sum 函式。熟悉 SQL 中彙總的開發人員,一定都熟悉這些函式。本主題的下列章節會加以說明。
彙總函式的結果包含在查詢結果中,做為查詢結果型別的欄位。您可以套用彙總函式結果的別名,以指定會保留彙總值之查詢結果型別之成員名稱。如果未提供別名,則會使用彙總函式的名稱。
Aggregate 子句可以用來開始查詢,也可以包含在查詢中做為額外子句。如果 Aggregate 子句用來開始查詢,則結果會是單一值,此值是 Into 子句中指定之彙總函式的結果。如果在 Into 子句中指定一個以上的彙總函式,查詢會傳回具有個別屬性的單一型別,以參考 Into 子句中每個彙總函式的結果。如果將 Aggregate 子句做為查詢中的額外子句,則查詢集合中傳回的型別會有個別的屬性,用以參考 Into 子句中每個彙總函式的結果。
彙總函式
下列清單描述可以與 Aggregate 子句一起使用的標準彙總函式。
All
如果集合中的所有項目都滿足指定的條件則傳回 true,否則會傳回 false。下列為範例:Dim customerList1 = Aggregate order In orders _ Into AllOrdersOver100 = All(order.Total >= 100)
Any
如果集合中的任何項目滿足指定的條件則傳回 true,否則會傳回 false。下列為範例:Dim customerList2 = From cust In customers _ Aggregate order In cust.Orders _ Into AnyOrderOver500 = Any(order.Total >= 500)
Average
計算集合中所有項目的平均值,或計算針對集合中所有項目而提供的運算式。下列為範例: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
參考 Group By 或 Group Join 子句之群組結果的查詢結果。Group 函式只有在 Group By 或 Group Join 子句的 Into 子句中才有效。如需詳細資訊與範例,請參閱 Group By 子句 (Visual Basic) 與 Group Join 子句 (Visual Basic)。LongCount
計算集合中的項目數。您可以提供選擇性的 Boolean 運算式,只計算集合中滿足條件的項目數。傳回 Long 的結果。如需範例,請參閱 Count 彙總函式。Max
計算集合的最大值,或計算針對集合中所有項目而提供的運算式。下列為範例: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)
Sum
計算集合中所有項目的總和,或計算針對集合中所有項目而提供的運算式。下列為範例: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
建立使用者定義的彙總函式
您可以在查詢運算式中包含自己的自訂彙總函式,方法是將擴充方法加入至 IEnumerable<T> 型別。接著,您的自訂方法就可以在參考您的彙總函式的可列舉集合上,執行計算或作業。如需擴充方法的詳細資訊,請參閱擴充方法 (Visual Basic)。
例如,下列程式碼範例顯示用於計算數值集合中間值的自訂彙總函式。Median 擴充方法有兩個多載。第一個多載會接受型別 IEnumerable(Of Double) 的集合,做為輸入。如果 Median 彙總函式是針對型別 Double 的查詢欄位進行呼叫,就會呼叫此方法。Median 方法的第二個多載可以傳遞任何泛型型別。Median 方法的泛型多載會採用第二個參數,該參數參考 Func(Of T, Double) Lambda 運算式,將型別的值 (根據集合) 投射為型別 Double 的對應值。接著將中間值的計算委派 (Delegate) 至 Median 方法的其他多載。 如需 Lambda 運算式的詳細資訊,請參閱 Lambda 運算式。
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
下列程式碼範例顯示在型別 Integer 的集合和型別 Double 的集合上,呼叫 Median 彙總函式的範例查詢。在型別 Double 的集合上呼叫 Median 彙總函式的查詢會呼叫 Median 方法的多載,接受型別 Double 的集合以做為輸入。 在型別 Integer 的集合上呼叫 Median 彙總函式的查詢,則會呼叫 Median 方法的泛型多載。
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