将一个或多个聚合函数应用于集合。
语法
Aggregate element [As type] In collection _
[, element2 [As type2] In collection2, [...]]
[ clause ]
Into expressionList
部件
| 术语 | 定义 |
|---|---|
element |
必填。 用于循环访问集合元素的变量。 |
type |
可选。
element 的类型。 如果未指定类型,则从中推断出collection类型element。 |
collection |
必填。 指要作的集合。 |
clause |
可选。 一个或多个查询子句(例如 Where 子句)用于优化查询结果以将聚合子句或子句应用到其中。 |
expressionList |
必填。 一个或多个逗号分隔的表达式,用于标识要应用于集合的聚合函数。 可以将别名应用于聚合函数,以指定查询结果的成员名称。 如果未提供别名,则使用聚合函数的名称。 有关示例,请参阅本主题后面的有关聚合函数的部分。 |
注解
子 Aggregate 句可用于在查询中包含聚合函数。 聚合函数对一组值执行检查和计算,并返回单个值。 可以使用查询结果类型的成员来访问计算值。 可以使用的标准聚合函数包括、、、、、、、和MinSum函数。 MaxLongCountCountAverageAnyAll 熟悉 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)
计数
计算集合中的元素数。 可以提供可选 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
以下示例显示了对类型Integer集合和类型Double集合调用Median聚合函数的示例查询。 对类型集合调用Median聚合函数的查询调用接受作为输入Double的方法的重载MedianDouble的类型。 在类型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