Pengikatan Data
LINQ to SQL mendukung pengikatan ke kontrol umum, seperti kontrol kisi. Secara khusus, LINQ to SQL mendefinisikan pola dasar untuk mengikat ke kisi data dan menangani pengikatan detail master, baik yang berkaitan dengan tampilan dan pembaruan.
Prinsip yang Mendasari
LINQ to SQL menerjemahkan kueri LINQ to SQL untuk dieksekusi pada database. Hasilnya diketik dengan kuat IEnumerable
. Karena objek ini adalah objek runtime bahasa umum (CLR), pengikatan data objek biasa dapat digunakan untuk menampilkan hasilnya. Di sisi lain, operasi perubahan (menyisipkan, memperbarui, dan menghapus) memerlukan langkah tambahan.
Operasi
Mengikat secara implisit ke kontrol Formulir Windows dilakukan dengan menerapkan IListSource. Sumber data umum Table<TEntity> (Table<T>
dalam C# atau Table(Of T)
dalam Visual Basic) dan umum DataQuery
telah diperbarui untuk menerapkan IListSource. Mesin pengikatan data antarmuka pengguna (UI) (Formulir Windows dan Windows Presentation Foundation) keduanya menguji apakah sumber data mereka menerapkan IListSource. Oleh karena itu, menulis pengaruh langsung kueri ke sumber data kontrol secara implisit memanggil pembuatan kumpulan LINQ to SQL, seperti dalam contoh berikut:
DataGrid dataGrid1 = new DataGrid();
DataGrid dataGrid2 = new DataGrid();
DataGrid dataGrid3 = new DataGrid();
var custQuery =
from cust in db.Customers
select cust;
dataGrid1.DataSource = custQuery;
dataGrid2.DataSource = custQuery;
dataGrid2.DataMember = "Orders";
BindingSource bs = new BindingSource();
bs.DataSource = custQuery;
dataGrid3.DataSource = bs;
Dim dataGrid1 As New DataGrid()
Dim dataGrid2 As New DataGrid()
Dim dataGrid3 As New DataGrid()
Dim custQuery = _
From cust In db.Customers _
Select cust
dataGrid1.DataSource = custQuery
dataGrid2.DataSource = custQuery
dataGrid2.DataMember = "Orders"
Dim bs = _
New BindingSource()
bs.DataSource = custQuery
dataGrid3.DataSource = bs
Hal yang sama terjadi dengan Windows Presentation Foundation:
ListView listView1 = new ListView();
var custQuery2 =
from cust in db.Customers
select cust;
ListViewItem ItemsSource = new ListViewItem();
ItemsSource = (ListViewItem)custQuery2;
Dim listView1 As New ListView()
Dim custQuery2 = _
From cust In db.Customers _
Select cust
Dim ItemsSource As New ListViewItem
ItemsSource = custQuery2
Pembuatan kumpulan diterapkan oleh Table<TEntity> umum dan DataQuery
umum di GetList.
Penerapan IListSource
LINQ to SQL menerapkan IListSource di dua lokasi:
Sumber datanya adalah Table<TEntity>: LINQ to SQL menelusuri tabel untuk mengisi kumpulan
DataBindingList
yang menyimpan referensi di tabel.Sumber datanya adalah IQueryable<T>. Ada dua skenario:
Jika LINQ to SQL menemukan Table<TEntity> yang mendasarinya dari IQueryable<T>, sumber mengizinkan edisi dan situasinya sama seperti pada poin pertama.
Jika LINQ to SQL tidak dapat menemukan Table<TEntity> yang mendasarinya, sumber tidak mengizinkan edisi (misalnya,
groupby
). LINQ to SQL menelusuri kueri untuk mengisiSortableBindingList
umum, yang merupakan BindingList<T> sederhana yang menerapkan fitur pengurutan untuk entitas T untuk properti tertentu.
Kumpulan Khusus
Untuk banyak fitur yang dijelaskan sebelumnya dalam dokumen ini, BindingList<T> telah dikhususkan untuk beberapa kelas yang berbeda. Kelas-kelas ini adalah SortableBindingList
umum dan DataBindingList
umum. Keduanya dinyatakan sebagai internal.
SortableBindingList Umum
Kelas ini mewarisi dari BindingList<T>, dan merupakan versi BindingList<T> yang dapat diurutkan. Pengurutan adalah solusi dalam memori dan tidak pernah menghubungi database itu sendiri. BindingList<T> menerapkan IBindingList tetapi tidak mendukung pengurutan secara default. Namun, BindingList<T> menerapkan IBindingList dengan metode inti virtual. Anda dapat dengan mudah mengganti metode ini. SortableBindingList
umum menggantikan SupportsSortingCore, SortPropertyCore, SortDirectionCore, dan ApplySortCore. ApplySortCore
dipanggil oleh ApplySort dan mengurutkan daftar item T untuk properti tertentu.
Pengecualian dimunculkan jika properti bukan milik T.
Untuk mencapai pengurutan, LINQ to SQL membuat kelas SortableBindingList.PropertyComparer
umum yang mewarisi dari IComparer.Compare umum dan menerapkan pembanding default untuk jenis T, PropertyDescriptor
, dan arah tertentu. Kelas ini secara dinamis membuat Comparer
dari T di mana T adalah PropertyType
dari PropertyDescriptor
. Kemudian, pembanding default diambil dari Comparer
umum statis. Instans default diperoleh dengan menggunakan refleksi.
SortableBindingList
umum juga merupakan kelas dasar untuk DataBindingList
. SortableBindingList
umum menawarkan dua metode virtual untuk menangguhkan atau melanjutkan item tambah/hapus pelacakan. Kedua metode tersebut dapat digunakan untuk fitur dasar seperti pengurutan, tetapi akan benar-benar diterapkan oleh kelas atas seperti DataBindingList
umum.
DataBindingList Umum
Kelas ini mewarisi dari SortableBindingLIst
umum. DataBindingList
umum menyimpan referensi pada Table
umum yang mendasari dari IQueryable
umum yang digunakan untuk pengisian awal kumpulan. DatabindingList
umum menambahkan pelacakan untuk item tambah/hapus ke kumpulan dengan menimpa InsertItem
() dan RemoveItem
(). Ini juga menerapkan fitur pelacakan penangguhan/lanjutan abstrak untuk membuat pelacakan bersyarat. Fitur ini membuat DataBindingList
umum memanfaatkan semua penggunaan polimorfik dari fitur pelacakan kelas induk.
Pengikatan ke EntitySets
Pengikatan ke EntitySet
adalah kasus khusus karena EntitySet
sudah merupakan kumpulan yang menerapkan IBindingList. LINQ to SQL menambahkan dukungan pengurutan dan pembatalan (ICancelAddNew). Kelas EntitySet
menggunakan daftar internal untuk menyimpan entitas. Daftar ini adalah kumpulan tingkat rendah berdasarkan array umum, kelas ItemList
umum.
Menambahkan Fitur Pengurutan
Array menawarkan metode pengurutan (Array.Sort()
) yang dapat Anda gunakan dengan Comparer
dari T. LINQ to SQL menggunakan kelas SortableBindingList.PropertyComparer
umum yang dijelaskan sebelumnya dalam topik ini untuk mendapatkan Comparer
ini untuk properti dan arah yang akan diurutkan. Metode ApplySort
ditambahkan ke ItemList
umum untuk memanggil fitur ini.
Di sisi EntitySet
, Anda sekarang harus mendeklarasikan dukungan pengurutan:
SupportsSorting menghasilkan
true
.ApplySort memanggil
entities.ApplySort()
laluOnListChanged()
.Properti SortDirection dan SortProperty mengekspos definisi pengurutan saat ini, yang disimpan di anggota lokal.
Saat Anda menggunakan System.Windows.Forms.BindingSource dan mengikat EntitySet<TEntity> ke System.Windows.Forms.BindingSource.DataSource, Anda harus memanggil EntitySet<TEntity>.GetNewBindingList untuk memperbarui BindingSource.List.
Jika Anda menggunakan System.Windows.Forms.BindingSource dan mengatur properti BindingSource.DataMember serta mengatur BindingSource.DataSource ke kelas yang memiliki properti bernama di BindingSource.DataMember yang mengekspos EntitySet<TEntity>, Anda tidak perlu memanggil EntitySet<TEntity>.GetNewBindingList untuk memperbarui BindingSource.List, tetapi Anda akan kehilangan kemampuan Pengurutan.
penembolokan
Kueri LINQ to SQL menerapkan GetList. Ketika kelas Formulir Windows BindingSource memenuhi antarmuka ini, kelas ini akan memanggil GetList() tiga kali untuk satu koneksi. Untuk mengatasi situasi ini, LINQ to SQL menerapkan cache per instans untuk menyimpan dan selalu mengembalikan kumpulan yang dihasilkan yang sama.
Pembatalan
IBindingList mendefinisikan metode AddNew yang digunakan oleh kontrol untuk membuat item baru dari kumpulan terikat. Kontrol DataGridView
menunjukkan fitur ini dengan sangat baik saat baris terakhir yang terlihat berisi bintang di headernya. Bintang menunjukkan bahwa Anda dapat menambahkan item baru.
Selain fitur ini, kumpulan juga dapat menerapkan ICancelAddNew. Fitur ini memungkinkan kontrol untuk membatalkan atau memvalidasi bahwa item yang baru diedit telah divalidasi atau tidak.
ICancelAddNew diterapkan di semua kumpulan databound LINQ to SQL (SortableBindingList
umum dan EntitySet
umum). Di kedua penerapan, kode melakukan hal berikut:
Memungkinkan item dimasukkan dan kemudian dihapus dari kumpulan.
Tidak melacak perubahan selama UI tidak menerapkan edisi.
Tidak melacak perubahan selama edisi dibatalkan (CancelNew).
Memungkinkan pelacakan saat edisi diterapkan (EndNew).
Mengizinkan kumpulan berperilaku normal jika item baru tidak berasal dari AddNew.
Pemecahan Masalah
Bagian ini memanggil beberapa item yang mungkin membantu memecahkan masalah LINQ Anda ke aplikasi pengikatan data SQL.
Anda harus menggunakan properti; menggunakan bidang saja tidak cukup. Formulir Windows memerlukan penggunaan ini.
Secara default, jenis database
image
,varbinary
, dantimestamp
dipetakan ke array byte. KarenaToString()
tidak didukung dalam skenario ini, objek ini tidak dapat ditampilkan.Anggota kelas yang dipetakan ke kunci utama memiliki pengatur, tetapi LINQ to SQL tidak mendukung perubahan identitas objek. Oleh karena itu, kunci utama/unik yang digunakan dalam pemetaan tidak dapat diperbarui dalam database. Perubahan pada kisi menyebabkan pengecualian saat Anda memanggil SubmitChanges.
Jika entitas terikat dalam dua kisi terpisah (misalnya, satu master dan detail lainnya),
Delete
di kisi master tidak disebarkan ke kisi detail.