Apa perbedaan antara list, set, dan bag di file pemetaan NHibernate? Bagaimana masing-masing terkait dengan koleksi .NET?
sumber
Apa perbedaan antara list, set, dan bag di file pemetaan NHibernate? Bagaimana masing-masing terkait dengan koleksi .NET?
Semantik NHibernate:
Daftar: Koleksi entitas yang dipesan, duplikat diperbolehkan. Gunakan .NET IList
dalam kode. Kolom indeks perlu dipetakan di NHibernate.
Set: Koleksi entitas unik yang tidak berurutan, duplikat tidak diperbolehkan. Gunakan Iesi.Collection.ISet
dalam kode (NH sebelum v4) atau System.Collections.Generic.ISet
(NH v4 +). Penting untuk mengganti GetHashCode
dan Equals
menunjukkan definisi bisnis duplikat. Dapat diurutkan dengan menentukan orderby atau dengan mendefinisikan pembanding yang menghasilkan SortedSet
hasil.
Tas: Daftar entitas yang tidak berurutan, duplikat diperbolehkan. Gunakan .NET ICollection<T>
dalam kode. Kolom indeks dari daftar tersebut tidak dipetakan dan tidak dihormati oleh NHibernate.
ISet
sajaIesi
?Semua objek di NHibernate ini persis sama dengan implementasi lain dari Tipe Data Abstrak (ADT) ini. Saya terkejut betapa sulitnya menemukan Set dan Tas online karena seberapa umum nama untuk hal-hal lain, jadi saya telah mencantumkan beberapa tautan dan deskripsi di sini.
Untuk informasi lebih rinci, lihat berikut ini: Daftar , Set , dan Tas
Aturan umumnya adalah:
Daftar secara default diurutkan, gunakan ini jika Anda ingin dapat menarik objek dengan indeksnya atau Anda menyukai
for
loop di atasforeach
loop. Anda tidak diharuskan untuk mengaksesnya dalam urutan seperti yang Anda perlukan dalam Daftar Tertaut . ADT ini memungkinkan duplikat.Tolong dicatat! Meskipun daftar diurutkan seperti yang disebutkan BryanD dalam jawabannya, sama sekali tidak ada yang mengatakan bahwa itu harus dalam urutan yang Anda harapkan dari database saat Anda menjalankan kueri HQL kecuali Anda menentukan urutan berdasarkan perintah. Karena hal inilah beberapa orang lebih suka menggunakan Set atau Bags sebagai gantinya, sehingga tidak memberikan ilusi untuk dipesan. Meskipun saya mengatakan ini, sebagian besar waktu mereka akan tampak dalam urutan yang terlihat, karena mereka ditambahkan ke daftar dalam urutan yang ditemukan dalam permintaan yang dijalankan NHibernate.
Set yang tidak secara default memerintahkan, Anda tidak dapat mengakses variabel apapun secara langsung melalui indeks. Set secara default adalah satu - satunya ADT dari tiga di atas yang mempertahankan keunikan objeknya . Ini bagus jika Anda memiliki koleksi jika Anda tidak ingin mengandung duplikat.
Tas (atau Multiset ) adalah, seperti yang Anda lihat dari tautan di atas, jenis Set yang memungkinkan objek di dalamnya menjadi duplikat dari objek lain. Ini umumnya tidak digunakan, karena pemesanan List dapat diabaikan, dan karenanya diperlakukan sebagai Bag.
Sehubungan dengan bagaimana ini digunakan di NHibernate, tidak ada yang ditarik dari database secara berbeda tergantung pada ADT mana yang Anda pilih di sini, untuk apa Anda ingin menggunakannya yang seharusnya membuat Anda memilih ADT yang berbeda.
Secara pribadi, saya menggunakan Sets untuk banyak hal karena saya biasanya membutuhkan objek turunan untuk menjadi unik dan pemesanan tidak menjadi masalah. Meskipun saya akan menggunakan Daftar di mana saya memiliki sekelompok objek yang ingin saya pesan berdasarkan sesuatu, misalnya waktu, untuk mencapai urutan ini, saya perlu mengatur "urutan menurut" secara manual dalam kueri HQL.
sumber
Perbedaan utamanya adalah daftar memiliki urutan implisit ke elemen, diindeks berdasarkan posisinya dalam daftar. Set dan tas juga dapat "dipesan" biasanya oleh Pembanding atau urutan berdasarkan klausul yang diterapkan ketika barang-barang itu keluar dari DB. Secara pribadi, saya tidak pernah menggunakan Tas ... jika saya tahu data yang saya inginkan dipesan secara berurutan saya menggunakan Daftar jika tidak saya menggunakan Set.
sumber
Set not memungkinkan Anda memiliki elemen berulang di dalamnya. Jika Anda akan mencoba menambahkan beberapa elemen baru, itu akan membandingkan (Metode yang sama digunakan) setiap elemen yang sudah ada dalam koleksi dengan yang Anda tambahkan, dan jika salah satu retun benar, elemen tidak akan ditambahkan
sumber