Aggregate — Klauzula (Visual Basic)

Stosuje co najmniej jedną funkcję agregacji do kolekcji.

Składnia

Aggregate element [As type] In collection _  
  [, element2 [As type2] In collection2, [...]]  
  [ clause ]  
  Into expressionList  

Części

Okres Definicja
element Wymagane. Zmienna używana do iterowania elementów kolekcji.
type Opcjonalny. Typ .element Jeśli nie określono żadnego typu, typ element jest wnioskowany z collection.
collection Wymagane. Odwołuje się do kolekcji do działania.
clause Opcjonalny. Co najmniej jedna klauzula zapytania, taka jak klauzula Where , aby uściślić wynik zapytania w celu zastosowania klauzuli agregującej lub klauzul.
expressionList Wymagane. Co najmniej jedno wyrażenie rozdzielane przecinkami identyfikujące funkcję agregacji, która ma być stosowana do kolekcji. Możesz zastosować alias do funkcji agregującej, aby określić nazwę elementu członkowskiego dla wyniku zapytania. Jeśli alias nie zostanie podany, zostanie użyta nazwa funkcji agregującej. Przykłady można znaleźć w sekcji dotyczącej funkcji agregujących w dalszej części tego tematu.

Uwagi

Klauzulę Aggregate można użyć do uwzględnienia funkcji agregujących w zapytaniach. Funkcje agregujące wykonują kontrole i obliczenia w zestawie wartości i zwracają pojedynczą wartość. Dostęp do obliczonej wartości można uzyskać przy użyciu elementu członkowskiego typu wyników zapytania. Standardowe funkcje agregujące, których można użyć, to Allfunkcje , Any, LongCountAverageMaxCount, Min, i .Sum Te funkcje są znane deweloperom, którzy znają agregacje w SQL. Opisano je w poniższej sekcji tego tematu.

Wynik funkcji agregującej jest uwzględniany w wyniku zapytania jako pole typu wyników zapytania. Możesz podać alias dla wyniku funkcji agregującej, aby określić nazwę elementu członkowskiego typu wyników zapytania, który będzie przechowywać wartość zagregowaną. Jeśli alias nie zostanie podany, zostanie użyta nazwa funkcji agregującej.

Klauzula Aggregate może rozpocząć zapytanie lub może zostać dołączona jako dodatkowa klauzula w zapytaniu. Jeśli klauzula Aggregate rozpoczyna zapytanie, wynikiem jest pojedyncza wartość, która jest wynikiem funkcji agregującej określonej w klauzuli Into . Jeśli w klauzuli Into określono więcej niż jedną funkcję agregowaną, zapytanie zwraca pojedynczy typ z oddzielną właściwością, aby odwołać się do wyniku każdej funkcji agregującej w klauzuli Into . Jeśli klauzula Aggregate jest dołączona jako dodatkowa klauzula w zapytaniu, typ zwrócony w kolekcji zapytań będzie miał oddzielną właściwość, aby odwołać się do wyniku każdej funkcji agregującej w klauzuli Into .

Funkcje agregujące

Poniżej przedstawiono standardowe funkcje agregujące, które mogą być używane z klauzulą Aggregate .

Wszystko

Zwraca wartość true , jeśli wszystkie elementy w kolekcji spełniają określony warunek; w przeciwnym razie zwraca wartość false. Poniżej przedstawiono przykład:

Dim customerList1 = Aggregate order In orders
                    Into AllOrdersOver100 = All(order.Total >= 100)

Dowolne

Zwraca true wartość , jeśli dowolny element w kolekcji spełnia określony warunek; w przeciwnym razie zwraca wartość false. Poniżej przedstawiono przykład:

Dim customerList2 = From cust In customers
                    Aggregate order In cust.Orders
                    Into AnyOrderOver500 = Any(order.Total >= 500)

Średnia

Oblicza średnią wszystkich elementów w kolekcji lub oblicza podane wyrażenie dla wszystkich elementów w kolekcji. Poniżej przedstawiono przykład:

Dim customerOrderAverage = Aggregate order In orders
                           Into Average(order.Total)

Liczba

Zlicza elementy w kolekcji. Możesz podać opcjonalne Boolean wyrażenie, aby zliczyć tylko liczbę elementów w kolekcji, które spełniają warunek. Poniżej przedstawiono przykład:

Dim customerOrderAfter1996 = From cust In customers
                             Aggregate order In cust.Orders
                             Into Count(order.OrderDate > #12/31/1996#)

Group (Grupa)

Odwołuje się do wyników zapytania, które są pogrupowane w wyniku klauzuli Group By lub Group Join . Funkcja jest prawidłowa Group tylko w Into klauzuli Group By lub Group Join . Aby uzyskać więcej informacji i przykłady, zobacz Klauzula Grupuj według i Klauzula dołączania do grupy.

Longcount

Zlicza elementy w kolekcji. Możesz podać opcjonalne Boolean wyrażenie, aby zliczyć tylko liczbę elementów w kolekcji, które spełniają warunek. Zwraca wynik jako Long. Aby zapoznać się z przykładem, zobacz Count funkcję agregacji.

Maks.

Oblicza maksymalną wartość z kolekcji lub oblicza podane wyrażenie dla wszystkich elementów w kolekcji. Poniżej przedstawiono przykład:

Dim customerMaxOrder = Aggregate order In orders
                       Into MaxOrder = Max(order.Total)

Min

Oblicza minimalną wartość z kolekcji lub oblicza podane wyrażenie dla wszystkich elementów w kolekcji. Poniżej przedstawiono przykład:

Dim customerMinOrder = From cust In customers
                       Aggregate order In cust.Orders
                       Into MinOrder = Min(order.Total)

Sum

Oblicza sumę wszystkich elementów w kolekcji lub oblicza podane wyrażenie dla wszystkich elementów w kolekcji. Poniżej przedstawiono przykład:

Dim customerTotals = From cust In customers
                     Aggregate order In cust.Orders
                     Into Sum(order.Total)

Przykład

W poniższym przykładzie pokazano, jak za pomocą klauzuli Aggregate zastosować funkcje agregujące do wyniku zapytania.

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

Tworzenie funkcji agregujących User-Defined

Własne niestandardowe funkcje agregujące można uwzględnić w wyrażeniu zapytania, dodając metody rozszerzenia do IEnumerable<T> typu. Metoda niestandardowa może następnie wykonać obliczenia lub operację w kolekcji wyliczalnej, która odwołuje się do funkcji agregującej. Aby uzyskać więcej informacji na temat metod rozszerzeń, zobacz Metody rozszerzeń.

Na przykład w poniższym przykładzie przedstawiono niestandardową funkcję agregacji, która oblicza medianę kolekcji liczb. Istnieją dwa przeciążenia Median metody rozszerzenia. Pierwsze przeciążenie akceptuje jako dane wejściowe kolekcję typu IEnumerable(Of Double). Median Jeśli funkcja agregacji jest wywoływana dla pola zapytania typu Double, ta metoda zostanie wywołana. Drugie przeciążenie Median metody może zostać przekazane w dowolnym typie ogólnym. Ogólne przeciążenie Median metody przyjmuje drugi parametr, który odwołuje się Func(Of T, Double) do wyrażenia lambda w celu projekcji wartości dla typu (z kolekcji) jako odpowiadającej mu wartości typu Double. Następnie deleguje obliczenie wartości mediany do innego przeciążenia Median metody. Aby uzyskać więcej informacji na temat wyrażeń lambda, zobacz Wyrażenia 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

W poniższym przykładzie pokazano przykładowe zapytania, które wywołają Median funkcję agregacji w kolekcji typu Integer, oraz kolekcję typu Double. Zapytanie, które wywołuje Median funkcję agregacji w kolekcji typu Double , wywołuje przeciążenie Median metody, która akceptuje jako dane wejściowe kolekcję typu Double. Zapytanie, które wywołuje Median funkcję agregacji w kolekcji typu Integer , wywołuje ogólne przeciążenie 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

Zobacz też