Aggregate 子句 (Visual Basic)

将一个或多个聚合函数应用于集合。

语法

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

另请参阅