Klausul Agregat (Visual Basic)

Menerapkan satu atau beberapa fungsi agregat ke koleksi.

Sintaks

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

Generator

Term Definisi
element Harus diisi. Variabel yang digunakan untuk iterasi melalui elemen koleksi.
type Opsional. Jenis element. Jika tidak ada jenis yang ditentukan, jenis element disimpulkan dari collection.
collection Harus diisi. Mengacu pada koleksi untuk beroperasi.
clause Opsional. Satu atau beberapa klausul kueri, seperti klausul Where, untuk memperbaiki hasil kueri untuk menerapkan klausul atau klausul agregat.
expressionList Harus diisi. Satu atau beberapa ekspresi yang dibatasi koma yang mengidentifikasi fungsi agregat untuk diterapkan ke koleksi. Anda bisa menerapkan alias ke fungsi agregat untuk menentukan nama anggota untuk hasil kueri. Jika tidak ada alias yang disediakan, nama fungsi agregat akan digunakan. Misalnya, lihat bagian tentang fungsi agregat nanti dalam topik ini.

Keterangan

Klausul Aggregate dapat digunakan untuk menyertakan fungsi agregat dalam kueri Anda. Fungsi agregat melakukan pemeriksaan dan komputasi atas sekumpulan nilai dan mengembalikan satu nilai. Anda bisa mengakses nilai komputasi dengan menggunakan anggota tipe hasil kueri. Fungsi agregat standar yang dapat Anda gunakan adalah fungsi All, Any, Average, Count, LongCount, Max, Min dan Sum. Fungsi-fungsi ini akrab bagi pengembang yang terbiasa dengan agregat dalam SQL. Mereka dijelaskan di bagian berikut dari topik ini.

Hasil fungsi agregat disertakan dalam hasil kueri sebagai bidang jenis hasil kueri. Anda dapat menyediakan alias untuk hasil fungsi agregat untuk menentukan nama anggota jenis hasil kueri yang akan menahan nilai agregat. Jika tidak ada alias yang disediakan, nama fungsi agregat akan digunakan.

Klausul Aggregate dapat memulai kueri, atau dapat disertakan sebagai klausul tambahan dalam kueri. Jika klausul Aggregate memulai kueri, hasilnya adalah nilai tunggal yang merupakan hasil dari fungsi agregat yang ditentukan dalam klausul Into. Jika lebih dari satu fungsi agregat ditentukan dalam klausul Into, kueri mengembalikan satu jenis dengan properti terpisah untuk mereferensikan hasil setiap fungsi agregat dalam klausul Into. Jika klausul Aggregate disertakan sebagai klausa tambahan dalam kueri, jenis yang dikembalikan dalam koleksi kueri akan memiliki properti terpisah untuk mereferensikan hasil setiap fungsi agregat dalam klausul Into.

Fungsi Agregat

Berikut ini adalah fungsi agregat standar yang dapat digunakan dengan klausul Aggregate.

Semua

Mengembalikan true jika semua elemen dalam koleksi memenuhi kondisi yang ditentukan; jika tidak, mengembalikan false. Berikut ini adalah contohnya:

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

Mana pun

Mengembalikan true jika ada elemen dalam koleksi yang memenuhi kondisi yang ditentukan; jika tidak, mengembalikan false. Berikut ini adalah contohnya:

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

Rata-rata

Menghitung rata-rata semua elemen dalam koleksi, atau menghitung ekspresi yang disediakan untuk semua elemen dalam koleksi. Berikut ini adalah contohnya:

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

Hitung

Menghitung jumlah elemen dalam koleksi. Anda dapat memberikan ekspresi Boolean opsional untuk menghitung hanya jumlah elemen dalam koleksi yang memenuhi kondisi. Berikut ini adalah contohnya:

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

Grupkan

Mengacu pada hasil kueri yang dikelompokkan sebagai hasil dari klausul Group By atau Group Join. Fungsi Group ini hanya valid dalam klausul Into dari klausul Group By atau Group Join. Untuk informasi dan contoh selengkapnya, lihat Kelompokkan Menurut Klausul dan KlausulGabungan Grup.

LongCount

Menghitung jumlah elemen dalam koleksi. Anda dapat memberikan ekspresi Boolean opsional untuk menghitung hanya jumlah elemen dalam koleksi yang memenuhi kondisi. Mengembalikan hasil sebagai Long. Misalnya, lihat fungsi agregat Count.

Maks

Menghitung nilai maksimum dari koleksi, atau menghitung ekspresi yang disediakan untuk semua elemen dalam koleksi. Berikut ini adalah contohnya:

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

Min

Menghitung nilai minimum dari koleksi, atau menghitung ekspresi yang disediakan untuk semua elemen dalam koleksi. Berikut ini adalah contohnya:

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

Jumlah total

Menghitung jumlah semua elemen dalam koleksi, atau menghitung ekspresi yang disediakan untuk semua elemen dalam koleksi. Berikut ini adalah contohnya:

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

Contoh

Contoh berikut menunjukkan cara menggunakan klausul Aggregate untuk menerapkan fungsi agregat ke hasil kueri.

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

Membuat Fungsi Agregat yang Ditentukan Pengguna

Anda dapat menyertakan fungsi agregat kustom Anda sendiri dalam ekspresi kueri dengan menambahkan metode ekstensi ke jenis IEnumerable<T>. Metode kustom Anda kemudian dapat melakukan penghitungan atau operasi pada koleksi enumerable yang telah mereferensikan fungsi agregat Anda. Untuk informasi selengkapnya tentang metode ekstensi, lihat Metode Ekstensi.

Misalnya, contoh berikut menunjukkan fungsi agregat kustom yang menghitung nilai median kumpulan angka. Ada dua kelebihan metode ekstensi Median. Kelebihan beban pertama menerima, sebagai input, kumpulan jenis IEnumerable(Of Double). Jika fungsi agregat Median dipanggil untuk bidang kueri jenis Double, metode ini akan dipanggil. Kelebihan beban kedua dari metode Median dapat diteruskan jenis generik apa pun. Kelebihan umum metode Median mengambil parameter kedua yang mereferensikan ekspresi lambda Func(Of T, Double) untuk memproyeksikan nilai untuk jenis (dari koleksi) sebagai nilai jenis Double yang sesuai. Kemudian mendelegasikan perhitungan nilai median ke kelebihan beban metode Median lainnya. Untuk informasi selengkapnya tentang ekspresi lambda, lihat Ekspresi 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

Contoh berikut menunjukkan contoh kueri yang memanggil fungsi agregat Median pada kumpulan jenis Integer, dan kumpulan jenis Double. Kueri yang memanggil fungsi agregat Median pada kumpulan jenis Double memanggil kelebihan beban metode Median yang menerima, sebagai input, kumpulan jenis Double. Kueri yang memanggil fungsi agregat Median pada kumpulan jenis Integer memanggil kelebihan umum metode Median.

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

Lihat juga