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 All
funkcje , , LongCount
Count
Average
Max
Any
Min
i .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 By
Group 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