Daftar vs Set vs Tas di NHibernate

109

Apa perbedaan antara list, set, dan bag di file pemetaan NHibernate? Bagaimana masing-masing terkait dengan koleksi .NET?

mrblah
sumber

Jawaban:

230

Semantik NHibernate:

  1. Daftar: Koleksi entitas yang dipesan, duplikat diperbolehkan. Gunakan .NET IListdalam kode. Kolom indeks perlu dipetakan di NHibernate.

  2. Set: Koleksi entitas unik yang tidak berurutan, duplikat tidak diperbolehkan. Gunakan Iesi.Collection.ISetdalam kode (NH sebelum v4) atau System.Collections.Generic.ISet(NH v4 +). Penting untuk mengganti GetHashCodedan Equalsmenunjukkan definisi bisnis duplikat. Dapat diurutkan dengan menentukan orderby atau dengan mendefinisikan pembanding yang menghasilkan SortedSethasil.

  3. 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.

Michael Gattuso
sumber
Re: # 2, tidak bisakah kita menggunakan biasa ISetsaja Iesi?
Sergei Tachenov
@SergeyTachenov: lihat stackoverflow.com/questions/9222058/… untuk kemungkinan jawaban. Saat jawaban ini ditulis ISet bukan bagian dari .net
Michael Gattuso
Jawaban paling tidak populer untuk pertanyaan itu adalah ya, karena NHibernate 4. Jadi mungkin pertanyaan ini perlu diedit juga.
Sergei Tachenov
21

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 forloop di atas foreachloop. 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.

Jay
sumber
2
Koreksi pada Daftar - menggunakan daftar dalam file pemetaan NHibernate AKAN memerlukan pemetaan kolom indeks. Dengan cara ini daftar akan ditarik keluar sesuai urutannya.
Michael Gattuso
@Michael Gattuso Poin yang bagus, saya seharusnya menyebutkan dalam jawaban di atas bahwa saya berbicara tentang kueri HQL (karenanya komentar 'pesan menurut') daripada spesifikasi koleksi sebenarnya dalam file pemetaan Anda.
Jay
Salah satu keuntungan menggunakan tas adalah tas tidak harus dimuat dari database saat Anda menambahkan elemen baru ke dalamnya. Tidak ada duplikat untuk diperiksa, tidak ada urutan untuk ditentukan.
tvaananen
1

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.

BryanD
sumber
0

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

Licik
sumber