Bagikan melalui


Kueri dalam LINQ ke Himpunan Data

Kueri adalah ekspresi yang mengambil data dari sumber data. Kueri biasanya diekspresikan dalam bahasa kueri khusus, seperti SQL untuk database hubungan dan XQuery untuk XML. Oleh karena itu, pengembang harus mempelajari bahasa kueri baru untuk setiap jenis sumber data atau format data yang mereka kueri. Language-Integrated Query (LINQ) menawarkan model yang lebih sederhana dan konsisten untuk bekerja dengan data di berbagai jenis sumber dan format data. Dalam kueri LINQ, Anda selalu bekerja dengan objek pemrograman.

Operasi kueri LINQ terdiri dari tiga tindakan: mendapatkan sumber data atau sumber, membuat kueri, serta menjalankan kueri.

Sumber data yang mengimplementasikan antarmuka generik IEnumerable<T> dapat dikueri melalui LINQ. Memanggil AsEnumerable pada DataTable mengembalikan objek yang mengimplementasikan antarmuka IEnumerable<T> generik, yang berfungsi sebagai sumber data untuk kueri LINQ to DataSet.

Dalam kueri, Anda menentukan persis informasi yang ingin Anda ambil dari sumber data. Kueri juga dapat menentukan bagaimana informasi tersebut harus diurutkan, dikelompokkan, dan dibentuk sebelum dikembalikan. Di LINQ, kueri disimpan dalam variabel. Jika kueri dirancang untuk mengembalikan urutan nilai, variabel kueri itu sendiri harus merupakan jenis yang dapat dijumlahkan. Variabel kueri ini tidak mengambil tindakan dan tidak mengembalikan data; hanya menyimpan informasi kueri. Setelah membuat kueri, Anda harus menjalankan kueri tersebut untuk mengambil data apa pun.

Dalam kueri yang mengembalikan urutan nilai, variabel kueri itu sendiri tidak pernah menyimpan hasil kueri dan hanya menyimpan perintah kueri. Eksekusi kueri ditunda hingga variabel kueri diulang dalam perulangan foreach atau For Each. Ini disebut eksekusi yang ditangguhkan; artinya, eksekusi kueri terjadi beberapa saat setelah kueri dibuat. Ini berarti Anda bisa menjalankan kueri sesering yang Anda inginkan. Ini berguna ketika, misalnya, Anda memiliki database yang sedang diperbarui oleh aplikasi lain. Di aplikasi, Anda dapat membuat kueri untuk mengambil informasi terbaru dan berulang kali menjalankan kueri, mengembalikan informasi yang diperbarui setiap saat.

Berbeda dengan kueri yang ditangguhkan, yang mengembalikan urutan nilai, kueri yang mengembalikan nilai singleton segera dijalankan. Beberapa contoh kueri tunggal adalah Count, Max, Average, dan First. Ini segera dijalankan karena hasil kueri diperlukan untuk menghitung hasil singleton. Misalnya, untuk menemukan rata-rata hasil kueri, kueri harus dijalankan sehingga fungsi rata-rata memiliki data input untuk dikerjakan. Anda juga dapat menggunakan metode ToList atau ToArray pada kueri untuk memaksa eksekusi langsung kueri yang tidak menghasilkan nilai tunggal. Teknik-teknik ini untuk memaksa eksekusi segera dapat berguna ketika Anda ingin cache hasil kueri.

Kueri

Kueri LINQ ke DataSet dapat diformulasikan dalam dua sintaks yang berbeda: sintaks ekspresi kueri dan sintaks kueri berbasis metode.

Sintaks Ekspresi Kueri

Ekspresi kueri adalah sintaks kueri deklaratif. Sintaks ini memungkinkan pengembang untuk menulis kueri dalam C# atau Visual Basic dalam format yang mirip dengan SQL. Dengan menggunakan sintaks ekspresi kueri, Anda bisa melakukan operasi pemfilteran, pemesanan, dan pengelompokan yang kompleks pada sumber data dengan kode minimal. Untuk informasi selengkapnya, lihat Ekspresi Kueri LINQ dan Operasi Kueri Dasar (Visual Basic).

Runtime bahasa umum (CLR) .NET Framework tidak dapat membaca sintaks ekspresi kueri itu sendiri. Oleh karena itu, pada waktu kompilasi, ekspresi kueri diterjemahkan ke sesuatu yang dipahami CLR: panggilan metode. Metode ini disebut sebagai operator kueri standar. Sebagai pengembang, Anda memiliki opsi untuk memanggilnya secara langsung dengan menggunakan sintaks metode, daripada menggunakan sintaks kueri. Untuk informasi selengkapnya, lihat Sintaksis kueri dan sintaks metode di LINQ. Untuk informasi selengkapnya tentang operator kueri standar, lihat Ringkasan Operator Kueri Standar.

Contoh berikut menggunakan Select untuk mengembalikan semua baris dari tabel Product dan menampilkan nama produk.

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable products = ds.Tables["Product"];

IEnumerable<DataRow> query =
    from product in products.AsEnumerable()
    select product;

Console.WriteLine("Product Names:");
foreach (DataRow p in query)
{
    Console.WriteLine(p.Field<string>("Name"));
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim products As DataTable = ds.Tables("Product")

Dim query = From product In products.AsEnumerable() _
            Select product
Console.WriteLine("Product Names:")
For Each p In query
    Console.WriteLine(p.Field(Of String)("Name"))
Next

Sintaks Kueri Berbasis Metode

Cara lain untuk merumuskan kueri LINQ to DataSet adalah dengan menggunakan kueri berbasis metode. Sintaks kueri berbasis metode adalah urutan panggilan metode langsung ke metode operator LINQ, meneruskan ekspresi lambda sebagai parameter. Untuk informasi selengkapnya, lihat Ekspresi Lambda.

Contoh ini menggunakan Select untuk mengembalikan semua baris dari Product dan menampilkan nama produk.

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable products = ds.Tables["Product"];

var query = products.AsEnumerable().
    Select(product => new
    {
        ProductName = product.Field<string>("Name"),
        ProductNumber = product.Field<string>("ProductNumber"),
        Price = product.Field<decimal>("ListPrice")
    });

Console.WriteLine("Product Info:");
foreach (var productInfo in query)
{
    Console.WriteLine("Product name: {0} Product number: {1} List price: ${2} ",
        productInfo.ProductName, productInfo.ProductNumber, productInfo.Price);
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim products As DataTable = ds.Tables("Product")

Dim query = products.AsEnumerable() _
    .Select(Function(product As DataRow) New With _
    { _
        .ProductName = product.Field(Of String)("Name"), _
        .ProductNumber = product.Field(Of String)("ProductNumber"), _
        .Price = product.Field(Of Decimal)("ListPrice") _
    })

Console.WriteLine("Product Info:")
For Each product In query
    Console.Write("Product name: " & product.ProductName)
    Console.Write("Product number: " & product.ProductNumber)
    Console.WriteLine("List price: $ " & product.Price)
Next

Menyusun Kueri

Seperti disebutkan sebelumnya dalam topik ini, variabel kueri itu sendiri hanya menyimpan perintah kueri saat kueri dirancang untuk mengembalikan urutan nilai. Jika kueri tidak berisi metode yang akan menyebabkan eksekusi langsung, eksekusi kueri yang sebenarnya akan ditunda hingga Anda mengulangi variabel kueri dalam perulangan foreach atau For Each. Eksekusi yang ditangguhkan memungkinkan beberapa kueri digabungkan atau kueri diperluas. Ketika diperluas, kueri dimodifikasi untuk memasukkan operasi baru, dan eksekusi akhirnya akan mencerminkan perubahan. Dalam contoh berikut, kueri pertama mengembalikan semua produk. Kueri kedua memperluas yang pertama dengan menggunakan Where untuk mengembalikan semua produk berukuran "L":

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable products = ds.Tables["Product"];

IEnumerable<DataRow> productsQuery =
    from product in products.AsEnumerable()
    select product;

IEnumerable<DataRow> largeProducts =
    productsQuery.Where(p => p.Field<string>("Size") == "L");

Console.WriteLine("Products of size 'L':");
foreach (DataRow product in largeProducts)
{
    Console.WriteLine(product.Field<string>("Name"));
}

' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim products As DataTable = ds.Tables("Product")

Dim productsQuery = From product In products.AsEnumerable() _
                    Select product

Dim largeProducts = _
    productsQuery.Where(Function(p) p.Field(Of String)("Size") = "L")

Console.WriteLine("Products of size 'L':")
For Each product In largeProducts
    Console.WriteLine(product.Field(Of String)("Name"))
Next

Setelah kueri dijalankan, tidak ada kueri tambahan yang dapat disusam, dan semua kueri berikutnya akan menggunakan operator LINQ dalam memori. Eksekusi kueri akan terjadi saat Anda mengulangi variabel kueri dalam pernyataan foreach atau For Each, atau dengan panggilan ke salah satu operator konversi LINQ yang menyebabkan eksekusi langsung. Operator tersebut meliputi: ToList, ToArray, ToLookup, dan ToDictionary.

Dalam contoh berikut, kueri pertama mengembalikan semua produk yang diurutkan berdasarkan harga daftar. Metode ToArray ini digunakan untuk memaksa eksekusi kueri segera:

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable products = ds.Tables["Product"];

IEnumerable<DataRow> query =
    from product in products.AsEnumerable()
    orderby product.Field<Decimal>("ListPrice") descending
    select product;

// Force immediate execution of the query.
IEnumerable<DataRow> productsArray = query.ToArray();

Console.WriteLine("Every price from highest to lowest:");
foreach (DataRow prod in productsArray)
{
    Console.WriteLine(prod.Field<Decimal>("ListPrice"));
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim products As DataTable = ds.Tables("Product")

Dim query = _
        From product In products.AsEnumerable() _
        Order By product.Field(Of Decimal)("ListPrice") Descending _
        Select product

' Force immediate execution of the query.
Dim productsArray = query.ToArray()

Console.WriteLine("Every price From highest to lowest:")
For Each prod In productsArray
    Console.WriteLine(prod.Field(Of Decimal)("ListPrice"))
Next

Lihat juga