Share via


Single-Table Kueri (LINQ ke Himpunan Data)

Kueri Language-Integrated Query (LINQ) berfungsi pada sumber data yang mengimplementasikan antarmuka IEnumerable<T> atau antarmuka IQueryable<T>. Kelas DataTable tidak mengimplementasikan salah satu antarmuka, jadi Anda harus memanggil metode AsEnumerable jika Anda ingin menggunakan DataTable sebagai sumber dalam klausa From kueri LINQ.

Contoh berikut mendapatkan semua pesanan online dari tabel SalesOrderHeader dan menghasilkan ID pesanan, tanggal pesanan, dan nomor pesanan ke konsol.

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

DataTable orders = ds.Tables["SalesOrderHeader"];

var query =
    from order in orders.AsEnumerable()
    where order.Field<bool>("OnlineOrderFlag") == true
    select new
    {
        SalesOrderID = order.Field<int>("SalesOrderID"),
        OrderDate = order.Field<DateTime>("OrderDate"),
        SalesOrderNumber = order.Field<string>("SalesOrderNumber")
    };

foreach (var onlineOrder in query)
{
    Console.WriteLine("Order ID: {0} Order date: {1:d} Order number: {2}",
        onlineOrder.SalesOrderID,
        onlineOrder.OrderDate,
        onlineOrder.SalesOrderNumber);
}
' 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 orders As DataTable = ds.Tables("SalesOrderHeader")

Dim query = _
    From order In orders.AsEnumerable() _
    Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
    Select New With { _
        .SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
        .OrderDate = order.Field(Of DateTime)("OrderDate"), _
        .SalesOrderNumber = order.Field(Of String)("SalesOrderNumber") _
     }

For Each onlineOrder In query
    Console.Write("Order ID: " & onlineOrder.SalesOrderID)
    Console.Write(" Order date: " & onlineOrder.OrderDate)
    Console.WriteLine(" Order number: " & onlineOrder.SalesOrderNumber)
Next

Kueri variabel lokal diinisialisasi dengan ekspresi kueri, yang beroperasi pada satu atau beberapa sumber informasi dengan menerapkan satu atau beberapa operator kueri dari operator kueri standar atau, dalam kasus LINQ ke Himpunan Data, operator khusus untuk kelas DataSet. Ekspresi kueri dalam contoh sebelumnya menggunakan dua operator kueri standar: Where dan Select.

Klausa Where memfilter urutan berdasarkan kondisi, dalam hal ini, OnlineOrderFlag diatur ke true. Operator Select mengalokasikan dan mengembalikan objek dapat dihitung yang menangkap argumen yang diteruskan ke operator. Dalam contoh di atas ini, jenis anonim dibuat dengan tiga properti: SalesOrderID, OrderDate, dan SalesOrderNumber. Nilai ketiga properti ini diatur ke nilai kolom SalesOrderID, OrderDate, dan SalesOrderNumber dari tabel SalesOrderHeader.

Perulangan foreach kemudian menghitung objek enumerable yang dikembalikan oleh Select dan memperoleh hasil kueri. Karena kueri adalah jenis Enumerable, yang mengimplementasikan IEnumerable<T>, evaluasi kueri ditangguhkan hingga variabel kueri diulang menggunakan perulangan foreach. Evaluasi kueri yang ditangguhkan memungkinkan kueri disimpan sebagai nilai yang dapat dievaluasi beberapa kali, setiap kali menghasilkan hasil yang berpotensi berbeda.

Metode Field ini menyediakan akses ke nilai kolom DataRow dan SetField (tidak diperlihatkan dalam contoh sebelumnya) menetapkan nilai kolom dalam DataRow. Baik metode Field maupun metode SetField menangani jenis nilai yang dapat diubah ke null, jadi Anda tidak perlu secara eksplisit memeriksa nilai null. Kedua metode adalah metode generik, selain itu, yang berarti Anda tidak perlu mentransmisikan jenis pengembalian. Anda dapat menggunakan pengakses kolom yang sudah ada sebelumnya di DataRow (misalnya, o["OrderDate"]), tetapi melakukannya akan mengharuskan Anda untuk mentransmisikan objek kembali ke jenis yang sesuai. Jika kolom adalah jenis nilai yang dapat diubah ke null, Anda harus memeriksa apakah nilainya null dengan menggunakan metode IsNull. Untuk informasi selengkapnya, lihat Bidang Generik dan Metode SetField.

Perhatikan bahwa jenis data yang ditentukan dalam parameter T generik metode Field dan metode SetField harus cocok dengan jenis nilai yang mendasar atau InvalidCastException akan dilemparkan. Nama kolom yang ditentukan juga harus cocok dengan nama kolom di DataSet atau ArgumentException yang akan dilemparkan. Dalam kedua kasus tersebut, pengecualian dilemparkan pada enumerasi data durasi saat kueri dijalankan.

Lihat juga