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 All
funkcje , Any
, LongCount
Average
Max
Count
, 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