Предложение Aggregate (Visual Basic)Aggregate Clause (Visual Basic)

Применяет одну или несколько агрегатных функций к коллекции.Applies one or more aggregate functions to a collection.

СинтаксисSyntax

Aggregate element [As type] In collection _  
  [, element2 [As type2] In collection2, [...]]  
  [ clause ]  
  Into expressionList  

ЧастиParts

ТерминTerm ОпределениеDefinition
element Обязательно.Required. Переменная, используемая для прохода по элементам коллекции.Variable used to iterate through the elements of the collection.
type Необязательный элемент.Optional. Тип параметра element.The type of element. Если тип не указан, тип element выводится из collection.If no type is specified, the type of element is inferred from collection.
collection Обязательно.Required. Ссылается на коллекцию для обработки.Refers to the collection to operate on.
clause Необязательный элемент.Optional. Одно или несколько предложений запроса, например предложение Where, для уточнения результата запроса с целью применения предложения Aggregate или предложений к.One or more query clauses, such as a Where clause, to refine the query result to apply the aggregate clause or clauses to.
expressionList Обязательно.Required. Одно или несколько выражений с разделителями-запятыми, которые обозначают агрегатную функцию, применяемую к коллекции.One or more comma-delimited expressions that identify an aggregate function to apply to the collection. Можно применить псевдоним к агрегатной функции, чтобы указать имя элемента для результата запроса.You can apply an alias to an aggregate function to specify a member name for the query result. Если псевдоним не указан, используется имя агрегатной функции.If no alias is supplied, the name of the aggregate function is used. Примеры см. в разделе агрегатные функции далее в этом разделе.For examples, see the section about aggregate functions later in this topic.

ПримечанияRemarks

Предложение Aggregate можно использовать для включения в запросы агрегатных функций.The Aggregate clause can be used to include aggregate functions in your queries. Агрегатные функции выполняют проверки и вычисления для набора значений и возвращают одно значение.Aggregate functions perform checks and computations over a set of values and return a single value. Доступ к вычисленному значению можно получить с помощью члена типа результата запроса.You can access the computed value by using a member of the query result type. Стандартные агрегатные функции, которые можно использовать, — это функции All, Any, Average, Count, LongCount, Max, Minи Sum.The standard aggregate functions that you can use are the All, Any, Average, Count, LongCount, Max, Min, and Sum functions. Эти функции знакомы разработчикам, знакомым со статистическими выражениями в SQL.These functions are familiar to developers who are familiar with aggregates in SQL. Они описаны в следующем разделе этой статьи.They are described in the following section of this topic.

Результат агрегатной функции включается в результат запроса в виде поля типа результата запроса.The result of an aggregate function is included in the query result as a field of the query result type. Можно указать псевдоним для результата агрегатной функции, чтобы указать имя элемента типа результата запроса, который будет содержать статистическое значение.You can supply an alias for the aggregate function result to specify the name of the member of the query result type that will hold the aggregate value. Если псевдоним не указан, используется имя агрегатной функции.If no alias is supplied, the name of the aggregate function is used.

Предложение Aggregate может начать запрос или его можно добавить как дополнительное предложение в запросе.The Aggregate clause can begin a query, or it can be included as an additional clause in a query. Если предложение Aggregate начинает запрос, результатом является единственное значение, которое является результатом агрегатной функции, указанной в предложении Into.If the Aggregate clause begins a query, the result is a single value that is the result of the aggregate function specified in the Into clause. Если в предложении Into указано более одной агрегатной функции, запрос возвращает один тип с отдельным свойством для ссылки на результат каждой агрегатной функции в предложении Into.If more than one aggregate function is specified in the Into clause, the query returns a single type with a separate property to reference the result of each aggregate function in the Into clause. Если предложение Aggregate включено в запрос в качестве дополнительного предложения, то тип, возвращаемый в коллекции запросов, будет иметь отдельное свойство для ссылки на результат каждой агрегатной функции в предложении Into.If the Aggregate clause is included as an additional clause in a query, the type returned in the query collection will have a separate property to reference the result of each aggregate function in the Into clause.

Статистические функцииAggregate Functions

Ниже приведены стандартные агрегатные функции, которые можно использовать с предложением Aggregate.The following are the standard aggregate functions that can be used with the Aggregate clause.

ВсеAll

Возвращает true, если все элементы в коллекции соответствуют заданному условию. в противном случае возвращает false.Returns true if all elements in the collection satisfy a specified condition; otherwise returns false. Ниже рассматривается пример:The following is an example:

Dim customerList1 = Aggregate order In orders
                    Into AllOrdersOver100 = All(order.Total >= 100)

ЛюбойAny

Возвращает true, если любой элемент в коллекции удовлетворяет заданному условию. в противном случае возвращает false.Returns true if any element in the collection satisfies a specified condition; otherwise returns false. Ниже рассматривается пример:The following is an example:

Dim customerList2 = From cust In customers
                    Aggregate order In cust.Orders
                    Into AnyOrderOver500 = Any(order.Total >= 500)

AverageAverage

Вычисляет среднее значение всех элементов в коллекции или вычисляет заданное выражение для всех элементов в коллекции.Computes the average of all elements in the collection, or computes a supplied expression for all elements in the collection. Ниже рассматривается пример:The following is an example:

Dim customerOrderAverage = Aggregate order In orders
                           Into Average(order.Total)

КоличествоCount

Подсчитывает количество элементов в коллекции.Counts the number of elements in the collection. Можно указать необязательное выражение Boolean, чтобы подсчитать только число элементов в коллекции, удовлетворяющее условию.You can supply an optional Boolean expression to count only the number of elements in the collection that satisfy a condition. Ниже рассматривается пример:The following is an example:

Dim customerOrderAfter1996 = From cust In customers
                             Aggregate order In cust.Orders
                             Into Count(order.OrderDate > #12/31/1996#)

ГруппаGroup

Относится к результатам запроса, сгруппированным в результате предложения Group By или Group Join.Refers to query results that are grouped as a result of a Group By or Group Join clause. Функция Group допустима только в предложении Into предложения Group By или Group Join.The Group function is valid only in the Into clause of a Group By or Group Join clause. Дополнительные сведения и примеры см. в разделе предложение Group By и предложение Group Join.For more information and examples, see Group By Clause and Group Join Clause.

LongCountLongCount

Подсчитывает количество элементов в коллекции.Counts the number of elements in the collection. Можно указать необязательное выражение Boolean, чтобы подсчитать только число элементов в коллекции, удовлетворяющее условию.You can supply an optional Boolean expression to count only the number of elements in the collection that satisfy a condition. Возвращает результат в виде Long.Returns the result as a Long. Пример см. в разделе агрегатная функция Count.For an example, see the Count aggregate function.

Макс.Max

Вычисление максимального значения из коллекции или вычисление заданного выражения для всех элементов в коллекции.Computes the maximum value from the collection, or computes a supplied expression for all elements in the collection. Ниже рассматривается пример:The following is an example:

Dim customerMaxOrder = Aggregate order In orders
                       Into MaxOrder = Max(order.Total)

Мин.Min

Вычисление минимального значения из коллекции или вычисление заданного выражения для всех элементов в коллекции.Computes the minimum value from the collection, or computes a supplied expression for all elements in the collection. Ниже рассматривается пример:The following is an example:

Dim customerMinOrder = From cust In customers
                       Aggregate order In cust.Orders
                       Into MinOrder = Min(order.Total)

SumSum

Вычисляет сумму всех элементов в коллекции или вычисляет заданное выражение для всех элементов в коллекции.Computes the sum of all elements in the collection, or computes a supplied expression for all elements in the collection. Ниже рассматривается пример:The following is an example:

Dim customerTotals = From cust In customers
                     Aggregate order In cust.Orders
                     Into Sum(order.Total)

ПримерExample

В следующем примере показано, как использовать предложение Aggregate для применения агрегатных функций к результату запроса.The following example shows how to use the Aggregate clause to apply aggregate functions to a query result.

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

Создание определяемых пользователем агрегатных функцийCreating User-Defined Aggregate Functions

В выражение запроса можно включить собственные пользовательские агрегатные функции, добавив методы расширения в тип IEnumerable<T>.You can include your own custom aggregate functions in a query expression by adding extension methods to the IEnumerable<T> type. Пользовательский метод может затем выполнить вычисление или операцию над перечислимой коллекцией, на которую ссылается агрегатная функция.Your custom method can then perform a calculation or operation on the enumerable collection that has referenced your aggregate function. Дополнительные сведения о методах расширения см. в разделе Методы расширения.For more information about extension methods, see Extension Methods.

Например, в следующем примере показана пользовательская агрегатная функция, которая вычисляет медианное значение коллекции чисел.For example, the following example shows a custom aggregate function that calculates the median value of a collection of numbers. Существует две перегрузки метода расширения Median.There are two overloads of the Median extension method. Первая перегрузка принимает в качестве входных данных коллекцию типов IEnumerable(Of Double).The first overload accepts, as input, a collection of type IEnumerable(Of Double). Если для поля запроса типа Doubleвызывается агрегатная функция Median, будет вызван этот метод.If the Median aggregate function is called for a query field of type Double, this method will be called. Второй перегрузкой метода Median может быть передан любой универсальный тип.The second overload of the Median method can be passed any generic type. Универсальная перегрузка метода Median принимает второй параметр, который ссылается на Func(Of T, Double) лямбда-выражение для проецирования значения типа (из коллекции) в качестве соответствующего значения типа Double.The generic overload of the Median method takes a second parameter that references the Func(Of T, Double) lambda expression to project a value for a type (from a collection) as the corresponding value of type Double. Затем оно делегирует вычисление значения медианы другой перегрузке метода Median.It then delegates the calculation of the median value to the other overload of the Median method. Дополнительные сведения о лямбда-выражениях см. в разделе Лямбда-выражения.For more information about lambda expressions, see Lambda Expressions.

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.The following example shows sample queries that call the Median aggregate function on a collection of type Integer, and a collection of type Double. Запрос, который вызывает агрегатную функцию Median для коллекции типа Double вызывает перегрузку метода Median, который принимает в качестве входных данных коллекцию типов Double.The query that calls the Median aggregate function on the collection of type Double calls the overload of the Median method that accepts, as input, a collection of type Double. Запрос, который вызывает агрегатную функцию Median для коллекции типа Integer вызывает универсальную перегрузку метода Median.The query that calls the Median aggregate function on the collection of type Integer calls the generic overload of the Median method.

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

См. такжеSee also