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

Viz také