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  

generatora

Termin Definicja
element Wymagany. Zmienna używana do iterowania elementów kolekcji.
type Opcjonalny. Typ .element Jeśli nie określono żadnego typu, typ element jest wywnioskowany z collection.
collection Wymagany. Odnosi 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 do.
expressionList Wymagany. Co najmniej jedno wyrażenie rozdzielane przecinkami, które identyfikuje funkcję agregacji, która ma być stosowana do kolekcji. Alias można zastosować do funkcji agregującej, aby określić nazwę elementu członkowskiego dla wyniku zapytania. Jeśli nie podano aliasu, zostanie użyta nazwa funkcji agregującej. Aby zapoznać się z przykładami, zobacz sekcję dotyczącą 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 , , LongCountCountAverageMaxAnyMini .Sum Te funkcje są znane deweloperom, którzy znają agregacje w języku SQL. Opisano je w poniższej sekcji tego tematu.

Wynik funkcji agregującej jest uwzględniany w wyniku zapytania jako pole typu wyniku 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ść agregowaną. Jeśli nie podano aliasu, 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ę agregacji, 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 .

wszystkie

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)

Count

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#)

Grupuj

Odnosi się do wyników zapytania, które są pogrupowane w wyniku klauzuli Group By or Group Join . Funkcja jest prawidłowa Group tylko w Into klauzuli or Group ByGroup Join . Aby uzyskać więcej informacji i przykładów, zobacz Klauzula Grupuj według i Klauzula dołączania 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.

Maksimum

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)

Minimum

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 zdefiniowanych przez użytkownika

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ć obliczenie 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ę wartości 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żna przekazać dowolnym typem ogólnym. Ogólne przeciążenie Median metody przyjmuje drugi parametr, który odwołuje się Func(Of T, Double) do wyrażenia lambda, aby projektować wartość typu (z kolekcji) jako odpowiadającą wartość 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 przedstawiono 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ż