Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
kueri adalah ekspresi yang mengambil data dari sumber data. Kueri dinyatakan dalam bahasa kueri khusus. Seiring waktu, berbagai bahasa telah dikembangkan untuk berbagai jenis sumber data, misalnya, SQL untuk database relasional dan XQuery untuk XML. Ini membuatnya perlu bagi pengembang aplikasi untuk 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 di berbagai jenis sumber dan format data. Dalam kueri LINQ, Anda selalu bekerja dengan objek. Anda menggunakan pola pengkodian dasar yang sama untuk mengkueri dan mengubah data dalam dokumen XML, database SQL, ADO.NET himpunan data dan entitas, koleksi .NET Framework, dan sumber atau format lainnya tempat penyedia LINQ tersedia. Dokumen ini menjelaskan tiga fase pembuatan dan penggunaan kueri LINQ dasar.
Tiga Tahap Operasi Kueri
Operasi kueri LINQ terdiri dari tiga tindakan:
Dapatkan sumber-sumber data.
Buat kueri.
Mengeksekusi kueri.
Di LINQ, eksekusi kueri berbeda dari pembuatan kueri. Anda tidak memperoleh data apa pun hanya dengan membuat kueri. Poin ini dibahas secara lebih rinci nanti dalam topik ini.
Contoh berikut memperjelas tiga langkah operasi kueri. Contohnya menggunakan array bilangan bulat sebagai sumber data yang nyaman untuk tujuan demonstrasi. Namun, konsep yang sama juga berlaku untuk sumber data lain.
Nota
Pada Halaman Kompilasi, Desainer Proyek (Visual Basic), pastikan bahwa Inferensi Opsi 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
Keluaran:
0 2 4 6
Sumber Data
Karena sumber data dalam contoh sebelumnya adalah array, sumber data secara implisit mendukung antarmuka generik IEnumerable<T> . Fakta inilah yang memungkinkan Anda menggunakan array sebagai sumber data untuk kueri LINQ. Jenis yang mengakomodasi IEnumerable<T> atau antarmuka turunan seperti generik IQueryable<T> dikenal sebagai jenis yang dapat dikueri.
Sebagai jenis yang dapat dikueri secara implisit, array tidak memerlukan modifikasi atau perlakuan khusus untuk berfungsi sebagai sumber data LINQ. Hal yang sama berlaku untuk jenis koleksi apa pun yang mendukung IEnumerable<T>, termasuk kelas generik List<T>, Dictionary<TKey,TValue>, dan lainnya di pustaka kelas .NET Framework.
Jika data sumber belum menerapkan IEnumerable<T>, penyedia LINQ diperlukan untuk menerapkan fungsionalitas operator kueri standar untuk sumber data tersebut. Misalnya, LINQ ke XML menangani pekerjaan memuat dokumen XML ke dalam jenis yang dapat dikueri XElement , seperti yang diperlihatkan dalam contoh berikut. Untuk informasi selengkapnya tentang operator kueri standar, lihat Gambaran Umum Operator Kueri Standar (Visual Basic).
' Create a data source from an XML document.
Dim contacts = XElement.Load("c:\myContactList.xml")
Dengan LINQ ke SQL, Anda terlebih dahulu membuat pemetaan relasional objek pada waktu desain, baik secara manual atau dengan menggunakan LINQ ke Alat SQL di Visual Studio di Visual Studio. Anda menulis kueri Anda terhadap objek, dan pada run-time LINQ ke SQL menangani komunikasi dengan database. Dalam contoh berikut, customers mewakili tabel tertentu dalam database, dan Table<TEntity> mendukung generik IQueryable<T>.
' 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).) Aturan dasarnya sederhana: sumber data LINQ adalah objek apa pun yang mendukung antarmuka generik IEnumerable<T> , atau antarmuka yang mewarisinya.
Nota
Jenis seperti ArrayList yang mendukung antarmuka non-generik IEnumerable juga dapat digunakan sebagai sumber data LINQ. Untuk contoh yang menggunakan ArrayList, lihat Cara: Mengkueri ArrayList dengan LINQ (Visual Basic).
Kueri
Dalam kueri, Anda menentukan informasi apa yang ingin Anda ambil dari sumber data atau sumber. Anda juga memiliki opsi untuk menentukan bagaimana informasi tersebut harus diurutkan, dikelompokkan, atau disusun sebelum dikembalikan. Untuk mengaktifkan pembuatan kueri, Visual Basic telah menggabungkan sintaks kueri baru ke dalam bahasa tersebut.
Saat 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 spesifik dari setiap klausa ekspresi kueri dibahas dalam Operasi Kueri Dasar (Visual Basic). Untuk informasi selengkapnya, lihat Kueri. Perhatikan bahwa dalam LINQ, definisi kueri sering disimpan dalam variabel dan dijalankan nanti. Variabel kueri, seperti evensQuery dalam contoh sebelumnya, harus merupakan jenis yang dapat dikueri. Jenisnya evensQuery adalah IEnumerable(Of Integer), ditetapkan oleh pengkompilasi menggunakan inferensi jenis lokal.
Penting untuk diingat bahwa variabel kueri itu sendiri tidak mengambil tindakan dan tidak mengembalikan data. Ini hanya menyimpan definisi kueri. Dalam contoh sebelumnya, ini adalah perulangan For Each yang menjalankan kueri.
Eksekusi Kueri
Eksekusi kueri terpisah dari pembuatan kueri. Pembuatan kueri menentukan kueri, tetapi eksekusi dipicu oleh mekanisme yang berbeda. Kueri dapat dijalankan segera setelah didefinisikan (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. Ini membuat kueri tetapi tidak segera menjalankannya. 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 dalam contoh sebelumnya). Karena variabel kueri, evensQuery, menyimpan definisi kueri daripada hasil kueri, Anda bisa menjalankan kueri sesering yang Anda inginkan dengan menggunakan variabel kueri lebih dari satu kali. Misalnya, Anda mungkin memiliki database di aplikasi Anda yang sedang diperbarui terus-menerus oleh aplikasi terpisah. Setelah Anda membuat kueri yang mengambil data dari database tersebut, Anda bisa menggunakan perulangan For Each untuk menjalankan kueri berulang kali, mengambil data terbaru setiap saat.
Contoh berikut menunjukkan cara kerja eksekusi yang ditangguhkan. Setelah evensQuery2 didefinisikan dan dijalankan dengan perulangan For Each , seperti pada contoh sebelumnya, beberapa elemen dalam sumber numbers data diubah. Kemudian perulangan kedua For Each dijalankan evensQuery2 lagi. Hasilnya berbeda untuk kedua kalinya, karena pengulangan 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()
Keluaran:
Evens in original array:
0 2 4 6
Evens in changed array:
0 10 2 22 8
Eksekusi Segera
Dalam eksekusi kueri yang ditangguhkan, definisi kueri disimpan dalam variabel kueri untuk eksekusi nanti. Dalam eksekusi langsung, kueri dijalankan pada saat didefinisikan. Eksekusi dipicu saat Anda menerapkan metode yang memerlukan akses ke elemen individual dari hasil kueri. Eksekusi langsung sering dipaksa dengan menggunakan salah satu operator kueri standar yang mengembalikan nilai tunggal. Contohnya adalah Count, , MaxAverage, dan First. Operator kueri standar ini menjalankan kueri segera setelah diterapkan untuk menghitung dan mengembalikan hasil berupa singleton. Untuk informasi selengkapnya tentang operator kueri standar yang mengembalikan nilai tunggal, lihat Operasi Agregasi, Operasi Elemen, dan Operasi Pengkualifikasi.
Kueri berikut mengembalikan hitungan angka genap dalam array bilangan bulat. Definisi kueri tidak disimpan, dan numEvens hanyalah Integer yang sederhana.
Dim numEvens = (From num In numbers
Where num Mod 2 = 0
Select num).Count()
Anda dapat mencapai hasil yang sama dengan menggunakan Aggregate metode .
Dim numEvensAgg = Aggregate num In numbers
Where num Mod 2 = 0
Select num
Into Count()
Anda juga dapat memaksa eksekusi kueri dengan memanggil ToList metode 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 merupakan daftar dan evensArray merupakan array.
Menggunakan ToList atau ToArray untuk memaksa eksekusi segera sangat berguna dalam skenario di mana Anda ingin segera menjalankan kueri dan menyimpan hasilnya dalam satu objek koleksi. Untuk informasi selengkapnya tentang metode ini, lihat Mengonversi Jenis Data.
Anda juga dapat menyebabkan kueri dijalankan dengan menggunakan IEnumerable metode seperti IEnumerable.GetEnumerator metode .