Bagikan melalui


Menulis Kueri LINQ Pertama Anda (Visual Basic)

Kueri adalah ekspresi yang mengambil data dari sumber data. Kueri diekspresikan dalam bahasa kueri khusus. Seiring waktu, bahasa-bahasa yang berbeda telah dikembangkan untuk berbagai jenis sumber data, misalnya, SQL untuk database relasional dan XQuery untuk XML. Ini membuat pengembang aplikasi perlu mempelajari bahasa kueri baru untuk setiap jenis sumber data atau format data yang didukung.

Language-Integrated Query (LINQ) menyederhanakan situasi dengan menawarkan model yang konsisten untuk bekerja dengan data pada berbagai jenis sumber data dan format. Dalam kueri LINQ, Anda selalu bekerja dengan objek. Anda menggunakan pola pengkodean dasar yang sama untuk mengkueri dan mengubah data pada dokumen XML, SQL database, ADO.NET himpunan data dan entitas, koleksi .NET Framework, dan sumber atau format lain yang tersedia oleh penyedia LINQ. Dokumen ini menjelaskan tiga fase pembuatan dan penggunaan kueri LINQ dasar.

Tiga Tahap Operasi Kueri

Operasi kueri LINQ terdiri dari tiga tindakan:

  1. Dapatkan sumber data atau sumber.

  2. Buat kueri.

  3. Mengeksekusi kueri.

Pada LINQ, eksekusi kueri berbeda dari pembuatan kueri. Anda tidak mengambil data apa pun hanya dengan membuat kueri. Poin ini dibahas lebih rinci nanti dalam topik ini.

Contoh berikut ini mengilustrasikan tiga bagian operasi kueri. Contoh ini menggunakan array bilangan bulat sebagai sumber data yang nyaman untuk tujuan demonstrasi. Namun, konsep yang sama juga berlaku untuk sumber data lainnya.

Catatan

Pada Halaman Kompilasi, Perancang Proyek (Visual Basic), pastikan bahwa Opsi menyimpulkan diatur ke Aktif.

' Data source.
Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6}

' Query creation.
Dim evensQuery = From num In numbers
                 Where num Mod 2 = 0
                 Select num

' Query execution.
For Each number In evensQuery
    Console.Write(number & " ")
Next

Output:

0 2 4 6

Sumber Data

Karena sumber data pada contoh sebelumnya adalah array, maka sumber data tersebut secara implisit mendukung antarmuka IEnumerable<T> generik. Fakta inilah yang memungkinkan Anda memakai array sebagai sumber data untuk kueri LINQ. Jenis yang mendukung IEnumerable<T> atau antarmuka turunan seperti IQueryable<T> generik disebut jenis yang dapat dikueri.

Sebagai jenis yang dapat dikueri secara implisit, array tidak membutuhkan modifikasi atau perlakuan khusus untuk berfungsi sebagai sumber data LINQ. Hal yang sama berlaku untuk setiap jenis koleksi yang mendukung IEnumerable<T>, termasuk generik List<T>, Dictionary<TKey,TValue>, dan kelas lainnya di pustaka kelas .NET Framework.

Jika data sumber belum menerapkan IEnumerable<T>, penyedia LINQ diperlukan untuk mengimplementasikan fungsionalitas operator kueri standar untuk sumber data tersebut. Misalnya, LINQ ke XML menangani pekerjaan memuat dokumen XML ke dalam jenis XElement yang dapat dikueri, seperti yang diperlihatkan dalam contoh berikut. Untuk informasi selengkapnya mengenai operator kueri standar, lihat Gambaran Umum Operator Kueri Standar (C#).

' Create a data source from an XML document.
Dim contacts = XElement.Load("c:\myContactList.xml")

Dengan LINQ to SQL, Anda terlebih dahulu membuat pemetaan relasional objek pada waktu desain, baik secara manual atau dengan menggunakan LINQ to SQL Tools in Visual Studio di Visual Studio. Anda menulis kueri Anda terhadap objek, dan pada run-time LINQ to SQL menangani komunikasi dengan database. Dalam contoh berikut ini, customers mewakili tabel tertentu dalam database, dan Table<TEntity> mendukung IQueryable<T> generik.

' Create a data source from a SQL table.
Dim db As New DataContext("C:\Northwind\Northwnd.mdf")
Dim customers As Table(Of Customer) = db.GetTable(Of Customer)

Untuk informasi selengkapnya tentang cara membuat jenis sumber data tertentu, lihat dokumentasi untuk berbagai penyedia LINQ. (Untuk daftar penyedia ini, lihat LINQ (Language-Integrated Query).) Namun, aturan dasarnya sangat sederhana: sumber data LINQ adalah objek apa pun yang mendukung antarmuka generik IEnumerable<T>, atau antarmuka yang mewarisinya.

Catatan

Jenis seperti ArrayList yang mendukung antarmuka non-generik IEnumerable juga bisa digunakan sebagai sumber data LINQ. Untuk contoh yang menggunakan ArrayList, lihat Cara: Mengkueri ArrayList dengan LINQ (Visual Basic).

Kueri

D dalam kueri, Anda menentukan informasi apa yang ingin Anda ambil dari sumber data atau sumber. Anda juga mempunyai opsi untuk menentukan bagaimana informasi tersebut harus diurutkan, dikelompokkan, atau disusun sebelum dikembalikan. Untuk mengaktifkan pembuatan kueri, Visual Basic telah memasukkan sintaks kueri baru ke dalam bahasa.

Ketika dijalankan, kueri dalam contoh berikut mengembalikan semua angka genap dari array bilangan bulat, numbers.

' Data source.
Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6}

' Query creation.
Dim evensQuery = From num In numbers
                 Where num Mod 2 = 0
                 Select num

' Query execution.
For Each number In evensQuery
    Console.Write(number & " ")
Next

Ekspresi kueri berisi tiga klausa: From, Where dan Select. Fungsi dan tujuan khusus dari setiap klausa ekspresi kueri dibahas dalam Operasi Kueri Dasar (Visual Basic). Untuk informasi selengkapnya, lihat Kueri. Perhatikan bahwa di LINQ, definisi kueri sering disimpan dalam variabel dan dijalankan nanti. Variabel kueri, seperti evensQuery pada contoh sebelumnya, harus merupakan jenis yang dapat dikueri. Jenis evensQuery adalah IEnumerable(Of Integer), ditetapkan oleh pengkompilasi dengan menggunakan inferensi jenis lokal.

Penting untuk diingat bahwa variabel kueri itu sendiri tidak mengambil tindakan apa pun dan tidak mengembalikan data. Kueri ini hanya menyimpan definisi kueri. Pada contoh sebelumnya, ini adalah perulangan For Each yang menjalankan kueri.

Eksekusi Kueri

Eksekusi kueri terpisah dari pembuatan kueri. Pembuatan kueri menentukan kueri, tetapi eksekusinya dipicu oleh mekanisme yang berbeda. Kueri dapat dieksekusi segera setelah ditentukan (eksekusi segera), atau definisi dapat disimpan dan kueri dapat dijalankan nanti (eksekusi yang ditangguhkan).

Eksekusi Yang Ditangguhkan

Kueri LINQ umum menyerupai kueri dalam contoh sebelumnya, di mana evensQuery didefinisikan. Kueri akan dibuat tetapi tidak segera dijalankan. Sebagai gantinya, definisi kueri disimpan dalam variabel kueri evensQuery. Anda menjalankan kueri nanti, biasanya dengan menggunakan perulangan For Each, yang mengembalikan urutan nilai, atau dengan menerapkan operator kueri standar, seperti Count atau Max. Proses ini disebut sebagai eksekusi yang ditangguhkan.

' Query execution that results in a sequence of values.
For Each number In evensQuery
    Console.Write(number & " ")
Next

' Query execution that results in a single value.
Dim evens = evensQuery.Count()

Untuk urutan nilai, Anda mengakses data yang diambil dengan menggunakan variabel iterasi dalam perulangan For Each (number pada contoh sebelumnya). Karena variabel kueri ini, evensQuery, menyimpan definisi kueri daripada hasil kueri, Anda bisa menjalankan kueri sesering yang Anda inginkan dengan menggunakan variabel kueri lebih dari satu kali. Contohnya, mungkin akan ada database dalam aplikasi Anda yang terus diperbarui oleh aplikasi terpisah. Setelah Anda membuat kueri yang mengambil data dari database tersebut, Anda dapat menggunakan perulangan For Each untuk menjalankan kueri berulang kali, mengambil data terbaru setiap saat.

Contoh berikut ini menunjukkan cara kerja eksekusi yang ditangguhkan. Setelah evensQuery2 didefinisikan dan dijalankan dengan perulangan For Each, seperti dalam contoh sebelumnya, beberapa elemen dalam sumber data numbers diubah. Lalu, perulangan For Each kedua berjalan evensQuery2 lagi. Hasilnya akan berbeda untuk kedua kalinya, karena perulangan For Each menjalankan kueri lagi, menggunakan nilai baru di numbers.

Dim numberArray() = {0, 1, 2, 3, 4, 5, 6}

Dim evensQuery2 = From num In numberArray
                  Where num Mod 2 = 0
                  Select num

Console.WriteLine("Evens in original array:")
For Each number In evensQuery2
    Console.Write("  " & number)
Next
Console.WriteLine()

' Change a few array elements.
numberArray(1) = 10
numberArray(4) = 22
numberArray(6) = 8

' Run the same query again.
Console.WriteLine(vbCrLf & "Evens in changed array:")
For Each number In evensQuery2
    Console.Write("  " & number)
Next
Console.WriteLine()

Output:

Evens in original array:

0 2 4 6

Evens in changed array:

0 10 2 22 8

Eksekusi Segera

Pada eksekusi kueri yang ditangguhkan, definisi kueri disimpan dalam variabel kueri untuk eksekusi nanti. Pada eksekusi langsung, kueri dijalankan pada saat pendefinisiannya. Eksekusi dipicu ketika Anda menerapkan metode yang memerlukan akses ke elemen individual dari hasil kueri. Eksekusi langsung sering dipaksakan dengan menggunakan salah satu operator kueri standar yang mengembalikan nilai tunggal. Contohnya adalah: Count, Max, Average, atau First. Operator kueri standar ini menjalankan kueri segera setelah diterapkan untuk menghitung serta mengembalikan hasil tunggal. Untuk informasi selengkapnya tentang operator kueri standar yang mengembalikan nilai tunggal, lihat Operasi Agregasi, Operasi Elemen, dan Operasi Pengkualifikasi.

Kueri berikut ini mengembalikan hitungan angka genap dalam array bilangan bulat. Definisi kueri tidak disimpan, dan numEvens adalah Integer yang sederhana.

Dim numEvens = (From num In numbers
                Where num Mod 2 = 0
                Select num).Count()

Anda bisa mencapai hasil yang sama dengan menggunakan metode Aggregate.

Dim numEvensAgg = Aggregate num In numbers
                  Where num Mod 2 = 0
                  Select num
                  Into Count()

Anda juga bisa memaksa eksekusi kueri dengan memanggil metode ToList atau ToArray pada kueri (segera) atau variabel kueri (ditangguhkan), seperti yang ditunjukkan dalam kode berikut.

' Immediate execution.
Dim evensList = (From num In numbers
                 Where num Mod 2 = 0
                 Select num).ToList()

' Deferred execution.
Dim evensQuery3 = From num In numbers
                  Where num Mod 2 = 0
                  Select num
' . . .
Dim evensArray = evensQuery3.ToArray()

Dalam contoh sebelumnya, evensQuery3 adalah variabel kueri, tetapi evensList adalah sebuah daftar dan evensArray adalah array.

Menggunakan ToList atau ToArray untuk memaksa eksekusi segera sangat berguna dalam skenario di mana Anda ingin segera menjalankan kueri dan menyimpan hasilnya di satu objek koleksi. Untuk informasi selengkapnya tentang metode ini, lihat Mengonversi Jenis Data.

Anda juga bisa membuat kueri dijalankan dengan menggunakan metode IEnumerable seperti metode IEnumerable.GetEnumerator.

Lihat juga