Предложение 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
, Count
Average
, , LongCount
Max
а Sum
Min
также функции. Эти функции знакомы разработчикам, знакомым с агрегатами в 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)
Count
Подсчитывает количество элементов в коллекции. Можно указать необязательное Boolean
выражение для подсчета только количества элементов в коллекции, удовлетворяющих условию. Ниже приведен пример:
Dim customerOrderAfter1996 = From cust In customers
Aggregate order In cust.Orders
Into Count(order.OrderDate > #12/31/1996#)
Групповой
Ссылается на результаты запроса, сгруппированные в результате Group By
предложения или Group Join
предложения. Функция действительна Group
только в Into
предложении или Group Join
предложенииGroup By
. Дополнительные сведения и примеры см. в предложении group by иgroup Join.
LongCount
Подсчитывает количество элементов в коллекции. Можно указать необязательное Boolean
выражение для подсчета только количества элементов в коллекции, удовлетворяющих условию. Возвращает результат в виде Long
. Пример см. в агрегатной Count
функции.
Макс.
Вычисляет максимальное значение из коллекции или вычисляет предоставленное выражение для всех элементов коллекции. Ниже приведен пример:
Dim customerMaxOrder = Aggregate order In orders
Into MaxOrder = Max(order.Total)
Мин.
Вычисляет минимальное значение из коллекции или вычисляет предоставленное выражение для всех элементов коллекции. Ниже приведен пример:
Dim customerMinOrder = From cust In customers
Aggregate order In cust.Orders
Into MinOrder = Min(order.Total)
Sum
Вычисляет сумму всех элементов в коллекции или вычисляет предоставленное выражение для всех элементов в коллекции. Ниже приведен пример:
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
Создание определяемых пользователем агрегатных функций
Вы можете включить собственные пользовательские статистические функции в выражение запроса, добавив методы расширения в IEnumerable<T> тип. Затем настраиваемый метод может выполнить вычисление или операцию в перечисленной коллекции, на которую ссылается агрегатная функция. Дополнительные сведения о методах расширения см. в разделе Методы расширения.
Например, в следующем примере показана пользовательская агрегатная функция, которая вычисляет медиановое значение коллекции чисел. Существует две перегрузки Median
метода расширения. Первая перегрузка принимает в качестве входных данных коллекцию типов IEnumerable(Of Double)
. Median
Если агрегатная функция вызывается для поля запроса типаDouble
, этот метод будет вызван. Вторая перегрузка метода может быть передана любому универсальному Median
типу. Универсальная перегрузка Median
метода принимает второй параметр, который ссылается Func(Of T, Double)
на лямбда-выражение для проецирования значения типа (из коллекции) в качестве соответствующего значения типа Double
. Затем он делегирует вычисление значения медиана другим перегрузкам Median
метода. Дополнительные сведения о лямбда-выражениях см. в разделе Лямбда-выражения.
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