Sdílet prostřednictvím


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 Allfunkce , Any, LongCountAverageCount, , Max, Mina 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 IntoGroup 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 Integera 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

Viz také