Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Применяет к коллекции одну или несколько агрегатных функций.
Синтаксис
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, CountAverage, , LongCountMaxа SumMinтакже функции. Эти функции знакомы разработчикам, знакомым с агрегатами в 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 By предложения или Group Join предложения. Функция действительна Group только в Into предложении или Group Join предложенииGroup By. Дополнительные сведения и примеры см. в предложении group by иgroup Join.
ЛонгКаунт
Подсчитывает количество элементов в коллекции. Можно указать необязательное 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)
Сумма
Вычисляет сумму всех элементов в коллекции или вычисляет предоставленное выражение для всех элементов в коллекции. Ниже приведен пример:
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) на лямбда-выражение для проецирования значения типа (из коллекции) в качестве соответствующего значения типа 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