Aggregate – klauzule (Visual Basic)
Použije jednu nebo více agregačních funkcí na kolekci.
Syntaxe
Aggregate element [As type] In collection _
[, element2 [As type2] In collection2, [...]]
[ clause ]
Into expressionList
Součástky
Pojem | definice |
---|---|
element |
Povinný: Proměnná použitá k iteraci prvky kolekce. |
type |
Nepovinné. Typ .element Pokud není zadán žádný typ, element typ je odvozen z collection . |
collection |
Povinný: Odkazuje na kolekci, na které se má pracovat. |
clause |
Nepovinné. Jedna nebo více klauzulí dotazu, například Where klauzule, pro upřesnění výsledku dotazu pro použití agregační klauzule nebo klauzulí. |
expressionList |
Povinný: Jeden nebo více výrazů oddělených čárkami, které identifikují agregační funkci, která se použije pro kolekci. Alias můžete použít u agregační funkce a zadat název člena pro výsledek dotazu. Pokud není zadán žádný alias, použije se název agregační funkce. Příklady najdete v části o agregačních funkcích dále v tomto tématu. |
Poznámky
Klauzuli Aggregate
lze použít k zahrnutí agregačních funkcí do dotazů. Agregační funkce provádějí kontroly a výpočty nad sadou hodnot a vracejí jednu hodnotu. K vypočítané hodnotě můžete přistupovat pomocí člena typu výsledku dotazu. Standardní agregační funkce, které můžete použít, jsou All
funkce , Any
, LongCount
Average
Count
, , Max
, Min
a Sum
funkce. Tyto funkce jsou známé vývojářům, kteří jsou obeznámeni s agregacemi v SQL. Jsou popsány v následující části tohoto tématu.
Výsledek agregační funkce je součástí výsledku dotazu jako pole typu výsledku dotazu. Můžete zadat alias pro výsledek agregační funkce a zadat název člena typu výsledku dotazu, který bude obsahovat agregační hodnotu. Pokud není zadán žádný alias, použije se název agregační funkce.
Klauzule Aggregate
může začínat dotaz nebo může být zahrnuta jako další klauzule v dotazu. Aggregate
Pokud klauzule zahájí dotaz, výsledkem je jedna hodnota, která je výsledkem agregační funkce zadané v Into
klauzuli. Pokud je v Into
klauzuli zadáno více než jedna agregační funkce, vrátí dotaz jeden typ s samostatnou vlastností, která odkazuje na výsledek každé agregační funkce v Into
klauzuli. Aggregate
Pokud je klauzule zahrnuta jako další klauzule v dotazu, typ vrácený v kolekci dotazů bude mít samostatnou vlastnost odkazovat na výsledek každé agregační funkce v Into
klauzuli.
Agregační funkce
Níže jsou uvedené standardní agregační funkce, které lze použít s klauzulí Aggregate
.
Vše
Vrátí true
, pokud všechny prvky v kolekci splňují zadanou podmínku; jinak vrátí false
. Následuje příklad:
Dim customerList1 = Aggregate order In orders
Into AllOrdersOver100 = All(order.Total >= 100)
Všechny
Vrátí true
, pokud některý prvek v kolekci splňuje zadanou podmínku; jinak vrátí false
. Následuje příklad:
Dim customerList2 = From cust In customers
Aggregate order In cust.Orders
Into AnyOrderOver500 = Any(order.Total >= 500)
Průměr
Vypočítá průměr všech prvků v kolekci nebo vypočítá zadaný výraz pro všechny prvky v kolekci. Následuje příklad:
Dim customerOrderAverage = Aggregate order In orders
Into Average(order.Total)
Počet
Spočítá počet prvků v kolekci. Můžete zadat volitelný Boolean
výraz pro počítání pouze počtu prvků v kolekci, které splňují podmínku. Následuje příklad:
Dim customerOrderAfter1996 = From cust In customers
Aggregate order In cust.Orders
Into Count(order.OrderDate > #12/31/1996#)
Seskupit
Odkazuje na výsledky dotazu seskupené jako výsledek Group By
klauzule nebo Group Join
klauzule. Funkce Group
je platná pouze v klauzuli Into
Group By
nebo Group Join
klauzuli. Další informace a příklady naleznete v tématu Klauzule Group By a Group Join Klauzule.
LongCount
Spočítá počet prvků v kolekci. Můžete zadat volitelný Boolean
výraz pro počítání pouze počtu prvků v kolekci, které splňují podmínku. Vrátí výsledek jako Long
. Příklad najdete v Count
agregační funkci.
Maximum
Vypočítá maximální hodnotu z kolekce nebo vypočítá zadaný výraz pro všechny prvky v kolekci. Následuje příklad:
Dim customerMaxOrder = Aggregate order In orders
Into MaxOrder = Max(order.Total)
Min.
Vypočítá minimální hodnotu z kolekce nebo vypočítá zadaný výraz pro všechny prvky v kolekci. Následuje příklad:
Dim customerMinOrder = From cust In customers
Aggregate order In cust.Orders
Into MinOrder = Min(order.Total)
Sum
Vypočítá součet všech prvků v kolekci nebo vypočítá zadaný výraz pro všechny prvky v kolekci. Následuje příklad:
Dim customerTotals = From cust In customers
Aggregate order In cust.Orders
Into Sum(order.Total)
Příklad
Následující příklad ukazuje, jak použít Aggregate
klauzuli k použití agregačních funkcí na výsledek dotazu.
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
Vytváření uživatelem definovaných agregačních funkcí
Do výrazu dotazu můžete zahrnout vlastní agregační funkce přidáním rozšiřujících metod do IEnumerable<T> typu. Vlastní metoda pak může provést výpočet nebo operaci s výčtovou kolekcí, která odkazovala na agregační funkci. Další informace o metodách rozšíření naleznete v tématu Metody rozšíření.
Následující příklad například ukazuje vlastní agregační funkci, která vypočítá medián hodnoty kolekce čísel. Existují dvě přetížení Median
metody rozšíření. První přetížení přijímá jako vstup kolekci typu IEnumerable(Of Double)
. Median
Pokud je agregační funkce volána pro pole dotazu typu Double
, bude volána tato metoda. Druhé přetížení Median
metody lze předat libovolný obecný typ. Obecná přetížení Median
metody přebírá druhý parametr, který odkazuje na Func(Of T, Double)
výraz lambda na projektování hodnoty pro typ (z kolekce) jako odpovídající hodnotu typu Double
. Pak deleguje výpočet mediánu na druhé přetížení Median
metody. Další informace o výrazech lambda najdete v tématu Výrazy 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
Následující příklad ukazuje ukázkové dotazy, které volají Median
agregační funkci pro kolekci typu Integer
a kolekci typu Double
. Dotaz, který volá Median
agregační funkci pro kolekci typů Double
volá přetížení Median
metody, která přijímá jako vstup kolekci typu Double
. Dotaz, který volá Median
agregační funkci v kolekci typu Integer
volá obecné přetížení Median
metody.
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