Összesítő záradék (Visual Basic)

Egy vagy több összesítő függvényt alkalmaz egy gyűjteményre.

Syntax

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

Részek

Időszak Definíció
element Szükséges. A gyűjtemény elemein keresztüli iteráláshoz használt változó.
type Opcionális. A típus.element Ha nincs megadva típus, a függvény a következőből elementcollectionkövetkeztet: .
collection Szükséges. A működtetni kívánt gyűjteményre hivatkozik.
clause Opcionális. Egy vagy több lekérdezési záradék( például egy Where záradék) a lekérdezés eredményének finomításához az összesítő záradék vagy záradékok alkalmazásához.
expressionList Szükséges. Egy vagy több vesszőből tagolt kifejezés, amely azonosítja a gyűjteményre alkalmazandó összesítő függvényt. Aliast alkalmazhat egy összesítő függvényre a lekérdezés eredményéhez tartozó tagnév megadásához. Ha nem ad meg aliast, a rendszer az összesítő függvény nevét használja. Példákért tekintse meg a témakör későbbi, összesítő függvényekkel foglalkozó szakaszát.

Megjegyzések

A Aggregate záradék használható összesítő függvények lekérdezésekbe való belefoglalására. Az aggregátumfüggvények ellenőrzéseket és számításokat végeznek egy értékhalmazon, és egyetlen értéket adnak vissza. A kiszámított értékhez a lekérdezés eredménytípusának egy tagját használva érheti el. A szabványos összesítő függvények Alla , , Any, Average, LongCountCount, , MaxMin, és Sum függvények. Ezek a függvények olyan fejlesztők számára ismerősek, akik ismerik az SQL összesítéseit. Ezeket a témakör következő szakaszában ismertetjük.

Az aggregátumfüggvény eredménye a lekérdezés eredménytípusának mezőjeként szerepel a lekérdezés eredményében. Az aggregátumfüggvény eredményéhez megadhat aliast annak a lekérdezési eredménytípusnak a nevének megadásához, amely az összesített értéket fogja tárolni. Ha nem ad meg aliast, a rendszer az összesítő függvény nevét használja.

A Aggregate záradék elindíthat egy lekérdezést, vagy további záradékként is szerepelhet egy lekérdezésben. Ha a Aggregate záradék lekérdezést kezd, az eredmény egyetlen érték, amely a záradékban Into megadott összesítő függvény eredménye. Ha a Into záradékban egynél több összesítő függvény van megadva, a lekérdezés egyetlen típust ad vissza külön tulajdonsággal, hogy hivatkozzon a Into záradék egyes összesítő függvényeinek eredményére. Ha a Aggregate záradék további záradékként szerepel egy lekérdezésben, a lekérdezésgyűjteményben visszaadott típusnak külön tulajdonsága lesz, amely a záradék összesítő függvényeinek Into eredményére hivatkozik.

Aggregátumfüggvények

A záradékkal használható standard összesítő függvények a Aggregate következők.

Mind

Visszaadja true , ha a gyűjtemény összes eleme megfelel egy megadott feltételnek, ellenkező esetben ad vissza false. Például:

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

Bármely

Visszaadja true , ha a gyűjtemény bármely eleme megfelel egy megadott feltételnek, ellenkező esetben ad vissza false. Például:

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

Átlag

Kiszámítja a gyűjtemény összes elemének átlagát, vagy kiszámít egy megadott kifejezést a gyűjtemény összes eleméhez. Például:

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

Count

Megszámolja a gyűjtemény elemeinek számát. Megadhat egy opcionális Boolean kifejezést, amely csak a gyűjtemény azon elemeinek számát számolja meg, amelyek megfelelnek egy feltételnek. Például:

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

Csoport

Olyan lekérdezési eredményekre hivatkozik, amelyek egy Group By vagy Group Join több záradék eredményeként vannak csoportosítva. A Group függvény csak egy Into vagy Group Join több Group By záradék záradékában érvényes. További információkért és példákért lásd : Group By Clause and Group Join Clause.

LongCount

Megszámolja a gyűjtemény elemeinek számát. Megadhat egy opcionális Boolean kifejezést, amely csak a gyűjtemény azon elemeinek számát számolja meg, amelyek megfelelnek egy feltételnek. Az eredményt Longad vissza . Például tekintse meg az Count összesítő függvényt.

Max

Kiszámítja a gyűjtemény maximális értékét, vagy kiszámít egy megadott kifejezést a gyűjtemény összes eleméhez. Például:

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

Min

Kiszámítja a gyűjtemény minimális értékét, vagy kiszámít egy megadott kifejezést a gyűjtemény összes eleméhez. Például:

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

Sum

Kiszámítja a gyűjtemény összes elemének összegét, vagy kiszámít egy megadott kifejezést a gyűjtemény összes eleméhez. Például:

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

Példa

Az alábbi példa bemutatja, hogyan alkalmazhat összesítő függvényeket a lekérdezés eredményére a Aggregate záradék használatával.

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

Felhasználó által definiált összesítő függvények létrehozása

A lekérdezési kifejezésekben saját egyéni összesítő függvényeket is felvehet, ha bővítménymetelyeket ad hozzá a IEnumerable<T> típushoz. Az egyéni metódus ezután elvégezhet egy számítást vagy műveletet az összesítő függvényre hivatkozó számba vett gyűjteményen. A bővítménymetelyekről további információt a Bővítménymetelyek című témakörben talál.

Az alábbi példa például egy egyéni aggregátumfüggvényt mutat be, amely kiszámítja egy számgyűjtemény mediánértékét. A bővítménymetódusnak két túlterhelése Median van. Az első túlterhelés bemenetként egy típusgyűjteményt IEnumerable(Of Double)fogad el. Ha az Median aggregátumfüggvény egy típusú Doublelekérdezésmezőhöz van meghívva, ez a metódus lesz meghívva. A metódus második túlterhelése Median bármilyen általános típusnak átadható. A metódus általános túlterhelése Median egy második paramétert vesz igénybe, amely a Func(Of T, Double) lambda kifejezésre hivatkozva egy típus értékét (gyűjteményből) veti ki a megfelelő típusként Double. Ezután delegálja a mediánérték számítását a metódus másik túlterhelésére Median . További információ a lambdakifejezésekről: Lambda Expressions.

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

Az alábbi példa egy típusgyűjtemény összesítő függvényét Integermeghívó Median minta lekérdezéseket és egy típusgyűjteményt Doublemutat be. A típusgyűjtemény Double összesítő függvényét meghívó Median lekérdezés meghívja annak a metódusnak a Median túlterhelését, amely bemenetként egy típusgyűjteményt Doublefogad el. A típusgyűjtemény Integer összesítő függvényét meghívó Median lekérdezés a metódus általános túlterhelését Median hívja meg.

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

Lásd még