Поделиться через


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

К коллекции применяется одна или несколько агрегатных функций.

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

Части

Термин

Определение

element

Обязательный. Переменная используется для циклического просмотра элементов коллекции.

type

Необязательный. Тип element. Если тип не указан, то тип element выводится из collection.

collection

Обязательный. Относится к коллекции, с которой выполняются операции.

clause

Необязательный. Одно или несколько предложений запроса, например предложение Where, для уточнения результатов запроса, к которым применяется статистическое предложение.

expressionList

Обязательный. Одно или более выражений, разделенных запятыми, которые идентифицируют агрегатную функцию, применяемую к коллекции. Можно применить псевдоним агрегатной функции, чтобы указать имя члена для результата запроса. Если псевдоним не указан, используется имя агрегатной функции. Примеры содержатся в разделе агрегатных функций далее в этом разделе.

Заметки

Предложение Aggregate может использоваться для включения агрегатных функций в запросы. Агрегатные функции выполняют проверку и вычисление по набору значений и возвращают одиночное значение. Можно получить доступ к вычисляемым значениям с помощью члена типа результата запроса. Стандартные агрегатные функции, которые можно использовать: All, Any, Average, Count, LongCount, Max, Min и Sum. Эти функции знакомы разработчикам, работавшим с агрегатными функциями в SQL. Они описаны далее в этом разделе.

Результат агрегатной функции включается в результат запроса в виде поля типа результата запроса. Можно указать псевдоним для результатов агрегатной функции, чтобы указать имя члена типа результата запроса, который будет содержать значение статистического выражения. Если псевдоним не указан, используется имя агрегатной функции.

Предложение Aggregate может располагаться в начале запроса или использоваться в нем в качестве дополнительного предложения. Если предложение Aggregate располагается в начале запроса, результатом является одно значение, которое представляет результат агрегатной функции, указанной в предложении Into. Если в предложении Into указано несколько агрегатных функций, запрос возвращает отдельный тип с отдельным свойством, ссылающийся на результаты каждой агрегатной функции в предложении Into. Если предложение Aggregate включено в запрос как дополнительное предложение, тип возвращаемой коллекции запроса будет иметь отдельные свойства, ссылающиеся на результат каждой агрегатной функции предложенияInto.

Агрегатные функции

Ниже перечислены стандартные агрегатные функции, которые могут указываться вместе с предложением Aggregate.

Function

Описание

All

Возвращает true, если все элементы в коллекции удовлетворяют указанному условию. В противном случае возвращает false. Например:

Any

Возвращает true, если все элементы в коллекции удовлетворяют указанному условию. В противном случае возвращает false. Например:

Average

Вычисляет среднее значение всех элементов в коллекции или указанное выражение для всех элементов в коллекции. Например:

Count

Подсчет числа элементов в коллекции. Можно указать необязательное выражение Boolean для подсчета числа только тех элементов в коллекции, которые удовлетворяют условию. Например:

Group

Ссылается на результаты запроса, которые сгруппированы в результате выполнения предложения Group By или Group Join. Функция Group допустима только в предложении Into предложения Group By или предложения Group Join. Дополнительные сведения и примеры см. в разделах Предложение Group By (Visual Basic) и Предложение Group Join (Visual Basic).

LongCount

Подсчет числа элементов в коллекции. Можно указать необязательное выражение Boolean для подсчета числа только тех элементов в коллекции, которые удовлетворяют условию. Возвращает результат типа Long. Пример см. в разделе "Агрегатная функция Count".

Max

Вычисляет максимальное значение всех элементов в коллекции или указанное выражение для всех элементов в коллекции. Например:

Min

Вычисляет минимальное значение всех элементов в коллекции или указанное выражение для всех элементов в коллекции. Например:

Sum

Вычисляет сумму всех элементов в коллекции или указанное выражение для всех элементов в коллекции. Например:

Пример

В следующем примере показывается использование предложения 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), чтобы проектировать значения для типа (из коллекции), как значение соответствующего типа Double. Затем делегируется расчет значения медианы другой перегрузке метода Median. Дополнительные сведения о лямбда-выражениях см. в разделе Лямбда-выражения (Visual Basic).

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. Запрос, который вызывает агрегатную функцию Median для коллекции типа Double, вызывает перегрузку метода Median, который принимает тип Double в качестве выходных данных. Запрос, который вызывает агрегатную функцию Median для коллекции типа Integer, вызывает универсальную перегрузку метода 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

См. также

Ссылки

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

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

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

Предложение Group By (Visual Basic)

Основные понятия

Знакомство с LINQ в Visual Basic

Другие ресурсы

Запросы (Visual Basic)