Bagikan melalui


Membuat Objek DataView (LINQ ke DataSet)

Ada dua cara untuk membuat DataView dalam konteks LINQ ke DataSet. Anda dapat membuat DataView dari kueri LINQ ke DataSet melalui DataTable, atau Anda dapat membuatnya dari DataTable yang diketik atau tidak diketik. Dalam kedua kasus tersebut, Anda membuat DataView dengan menggunakan salah satu dari AsDataView metode ekstensi; DataView tidak dapat dibangun secara langsung dalam konteks LINQ ke DataSet.

Setelah DataView dibuat, Anda dapat mengikatnya ke kontrol UI di aplikasi formulir Windows atau aplikasi ASP.NET, atau mengubah pengaturan pemfilteran dan pengurutan.

DataView menyusun indeks, yang secara signifikan meningkatkan performa operasi yang dapat menggunakan indeks, seperti pemfilteran dan pengurutan. Indeks untuk DataView dibangun saat DataView dibuat dan saat informasi pengurutan atau pemfilteran diubah. Membuat DataView lalu mengatur informasi pengurutan atau pemfilteran nanti menyebabkan indeks dibangun setidaknya dua kali: sekali saat DataView dibuat, dan sekali lagi saat salah satu properti urut atau filter diubah.

Untuk informasi selengkapnya tentang pemfilteran dan pengurutan dengan DataView, lihat Pemfilteran dengan DataView dan Pengurutan dengan DataView.

Membuat DataView dari Kueri LINQ ke DataSet

Objek DataView dapat dibuat dari hasil kueri LINQ ke DataSet, di mana hasilnya adalah proyeksi objek DataRow. DataView yang baru dibuat mewarisi informasi pemfilteran dan pengurutan dari kueri tempat pembuatannya.

Catatan

Dalam kebanyakan kasus, ekspresi yang digunakan untuk memfilter dan mengurutkan seharusnya tidak memiliki efek samping dan harus bersifat deterministik. Selain itu, ekspresi tidak boleh berisi logika apa pun yang bergantung pada sejumlah eksekusi yang ditetapkan, karena operasi pengurutan dan pemfilteran dapat dijalankan beberapa kali.

Membuat DataView dari kueri yang mengembalikan jenis anonim atau kueri yang melakukan operasi gabungan tidak didukung.

Hanya operator kueri berikut yang didukung dalam kueri yang digunakan untuk membuat DataView:

Perhatikan bahwa ketika DataView dibuat dari kueri LINQ ke DataSet, metode Select akan menjadi metode terakhir yang dipanggil dalam kueri. Ini ditunjukkan dalam contoh berikut, yang membuat DataView pesanan online diurutkan berdasarkan total jatuh tempo:

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

EnumerableRowCollection<DataRow> query =
    from order in orders.AsEnumerable()
    where order.Field<bool>("OnlineOrderFlag")
    orderby order.Field<decimal>("TotalDue")
    select order;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;
Dim orders As DataTable = dataSet.Tables("SalesOrderHeader")

Dim query = _
    From order In orders.AsEnumerable() _
    Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
    Order By order.Field(Of Decimal)("TotalDue") _
    Select order

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view

Anda juga dapat menggunakan properti RowFilter dan Sort berbasis string untuk memfilter dan mengurutkan DataView setelah dibuat dari kueri. Perhatikan bahwa ini akan menghapus informasi pengurutan dan pemfilteran yang diwarisi dari kueri. Contoh berikut membuat DataView dari kueri LINQ ke DataSet yang memfilter menurut nama belakang yang dimulai dengan 'S'. Properti Sort berbasis string diatur untuk mengurutkan nama belakang dalam urutan naik dan lalu nama depan dalam urutan menurun:

DataTable contacts = _dataSet.Tables["Contact"];

EnumerableRowCollection<DataRow> query = from contact in contacts.AsEnumerable()
                                         where contact.Field<string>("LastName").StartsWith("S")
                                         select contact;

DataView view = query.AsDataView();

bindingSource1.DataSource = view;

view.Sort = "LastName desc, FirstName asc";
Dim contacts As DataTable = dataSet.Tables("Contact")

Dim query = _
    From contact In contacts.AsEnumerable() _
    Where contact.Field(Of String)("LastName").StartsWith("S") _
    Select contact

Dim view As DataView = query.AsDataView()
bindingSource1.DataSource = view
view.Sort = "LastName desc, FirstName asc"

Membuat DataView dari DataTable

Selain dibuat dari kueri LINQ ke DataSet, objek DataView dapat dibuat dari DataTable dengan menggunakan metode AsDataView.

Contoh berikut membuat DataView dari tabel SalesOrderDetail dan menetapkannya sebagai sumber data objek BindingSource. Objek ini bertindak sebagai proksi untuk kontrol DataGridView.

DataTable orders = _dataSet.Tables["SalesOrderDetail"];

DataView view = orders.AsDataView();
bindingSource1.DataSource = view;

dataGridView1.AutoResizeColumns();
Dim orders As DataTable = dataSet.Tables("SalesOrderDetail")

Dim view As DataView = orders.AsDataView()
bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

Pemfilteran dan pengurutan dapat diatur pada DataView setelah dibuat dari DataTable. Contoh berikut membuat DataView dari tabel Kontak dan mengatur properti Sort untuk mengurutkan nama belakang dalam urutan naik lalu nama depan dalam urutan menurun:

DataTable contacts = _dataSet.Tables["Contact"];

DataView view = contacts.AsDataView();

view.Sort = "LastName desc, FirstName asc";

bindingSource1.DataSource = view;
dataGridView1.AutoResizeColumns();
Dim contacts As DataTable = dataSet.Tables("Contact")

Dim view As DataView = contacts.AsDataView()

view.Sort = "LastName desc, FirstName asc"

bindingSource1.DataSource = view
dataGridView1.AutoResizeColumns()

Namun, ada penurunan performa yang muncul dengan mengatur properti RowFilter atau Sort setelah DataView dibuat dari kueri, karena DataView menyusun indeks untuk mendukung operasi pemfilteran dan pengurutan. Mengatur properti RowFilter atau Sort akan membangun kembali indeks untuk data, menambahkan overhead ke aplikasi Anda dan menurunkan performa. Jika memungkinkan, sebaiknya tentukan informasi pemfilteran dan pengurutan saat Anda pertama kali membuat DataView dan jangan memodifikasinya setelahnya.

Lihat juga