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