Aggregate – klauzule (Visual Basic)
Použije jednu nebo více agregačních funkcí na kolekci.
Syntax
Aggregate element [As type] In collection _
[, element2 [As type2] In collection2, [...]]
[ clause ]
Into expressionList
Součásti
| Pojem | Definice |
|---|---|
element |
Povinná hodnota. Proměnná použitá k iteraci prvky kolekce. |
type |
Nepovinný parametr. Typ element . Pokud není zadán žádný typ, je element typ odvozen z collection . |
collection |
Povinná hodnota. Odkazuje na kolekci, se které se má pracovat. |
clause |
Nepovinný parametr. Jedna nebo více klauzulí dotazu, jako je klauzule , pro upřesnění výsledku dotazu, na který se má použít klauzule Where agregace nebo klauzule. |
expressionList |
Povinná hodnota. Jeden nebo více výrazů oddělených čárkami, které identifikují agregační funkci, která se má použít pro kolekci. Můžete použít alias na agregační funkci 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 na sadě hodnot a vrací 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 , , , , , a Any Average Count LongCount Max Min Sum . Tyto funkce znají vývojáři, kteří znají agregace v SQL. Jsou popsané v následující části tohoto tématu.
Výsledek agregační funkce je zahrnutý ve 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 agregovanou 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. Pokud klauzule začíná dotazem, výsledkem je jedna hodnota, která je výsledkem agregační funkce Aggregate zadané v Into klauzuli . Pokud je v klauzuli zadáno více než jedna agregační funkce, dotaz vrátí jeden typ se samostatnou vlastností, který odkazuje na výsledek každé agregační Into funkce v Into klauzuli . Pokud je klauzule zahrnuta jako další klauzule v dotazu, bude mít typ vrácený v kolekci dotazů samostatnou vlastnost pro odkazování na výsledek každé agregační Aggregate funkce v Into klauzuli .
Agregační funkce
Toto jsou standardní agregační funkce, které lze použít s Aggregate klauzulí .
Vše
Vrátí true hodnotu , pokud všechny prvky v kolekci splňují zadanou podmínku. V opačném případě vrátí hodnotu false . Například:
Dim customerList1 = Aggregate order In orders
Into AllOrdersOver100 = All(order.Total >= 100)
Všechny
Vrátí hodnotu , pokud některý prvek v kolekci splňuje true zadanou podmínku. V opačném případě vrátí false hodnotu . Napří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. Napří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, který spočítá pouze počet prvků v kolekci, které splňují podmínku. Například:
Dim customerOrderAfter1996 = From cust In customers
Aggregate order In cust.Orders
Into Count(order.OrderDate > #12/31/1996#)
Group (Skupina)
Odkazuje na výsledky dotazu seskupené jako výsledek Group By klauzule Group Join or. Funkce Group je platná pouze v Into klauzuli nebo Group By Group Join . Další informace a příklady najdete v tématu Group By – klauzule a klauzule Group Join.
LongCount
Spočítá počet prvků v kolekci. Můžete zadat volitelný Boolean výraz, který spočítá pouze počet prvků v kolekci, které splňují podmínku. Vrátí výsledek jako Long . Příklad najdete v článku o Count agregační funkci.
Maximum
Vypočítá maximální hodnotu z kolekce nebo vypočítá zadaný výraz pro všechny prvky v kolekci. Napří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. Napří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. Napří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
Vytvoření User-Defined 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 vyčíslitelnou kolekcí, která odkazuje na agregační funkci. Další informace o rozšiřujících metodách najdete v tématu Metody rozšíření.
Například následující příklad ukazuje vlastní agregační funkci, která vypočítá střední hodnotu kolekce čísel. Existují dvě přetížení Median rozšiřující metody. První přetížení přijímá jako vstup kolekci typu IEnumerable(Of Double) . Pokud je pro pole dotazu typu volána Median agregační funkce , bude tato metoda Double volána. Druhé přetížení metody může Median být předáno libovolnému obecnému typu. Obecné přetížení metody přebírá druhý parametr, který odkazuje na výraz lambda pro projektování hodnoty typu Median Func(Of T, Double) (z kolekce) jako odpovídající hodnoty typu Double . Potom deleguje výpočet hodnoty 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í agregační funkci pro kolekci typu Median Integer a kolekci typu Double . Dotaz, který volá agregační funkci v kolekci typu , volá přetížení metody , která jako vstup přijímá Median Double kolekci typu Median Double . Dotaz, který volá Median agregační funkci v kolekci Integer typu, 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