Lista vs zestaw vs torba w NHibernate

109

Jaka jest różnica między listą, zestawem i workiem w pliku mapowania NHibernate? W jaki sposób każda z nich odnosi się do kolekcji .NET?

mrblah
źródło

Odpowiedzi:

230

Semantyka NHibernate:

  1. Lista: uporządkowana kolekcja obiektów, dozwolone duplikaty. Użyj .NET IListw kodzie. Kolumna indeksu będzie musiała zostać zmapowana w NHibernate.

  2. Zestaw: nieuporządkowana kolekcja unikatowych obiektów, duplikaty nie są dozwolone. Użyj Iesi.Collection.ISetw kodzie (NH przed v4) lub System.Collections.Generic.ISet(NH v4 +). Ważne jest, aby zastąpić GetHashCodei Equalswskazać biznesową definicję duplikatu. Można sortować, definiując kolejność lub definiując funkcję porównującą, która daje SortedSetwynik.

  3. Torba: nieuporządkowana lista podmiotów, dozwolone duplikaty. Użyj .NET ICollection<T>w kodzie. Kolumna indeksu listy nie jest mapowana i nie jest honorowana przez NHibernate.

Michael Gattuso
źródło
Re: # 2, czy nie możemy użyć zwykłego ISetzamiast Iesi?
Siergiej Tachenov
@SergeyTachenov: zobacz stackoverflow.com/questions/9222058/…, aby uzyskać możliwą odpowiedź. Kiedy napisano tę odpowiedź, ISet nie był częścią .net
Michael Gattuso
Najmniej popularną odpowiedzią na to pytanie jest tak, ponieważ NHibernate 4. Więc może to pytanie również wymaga edycji.
Siergiej Tachenov
21

Wszystkie te obiekty w NHibernate są dokładnie takie same, jak inne implementacje tych abstrakcyjnych typów danych (ADT). Byłem zaskoczony, jak trudno jest znaleźć zestawy i torby online ze względu na powszechność nazw innych rzeczy, więc zamieściłem tutaj kilka linków i opisów.

Aby uzyskać bardziej szczegółowe informacje, zapoznaj się z następującymi: Listy , Zestawy i Torby

Ogólne zasady to:

Listy są domyślnie uporządkowane, użyj ich, jeśli chcesz mieć możliwość wyciągnięcia obiektu według jego indeksu lub masz dziwne zamiłowanie do forpętli nad foreachpętlami. Nie musisz uzyskiwać do nich dostępu w takiej kolejności, jak w przypadku listy połączonej . Ten ADT zezwala na duplikaty.

Proszę zanotować! Chociaż listy są uporządkowane tak, jak BryanD wspomniał w swojej odpowiedzi, nie ma absolutnie nic, co mówi, że musi być w kolejności, jakiej oczekujesz od bazy danych podczas wykonywania zapytania HQL, chyba że określisz kolejność za pomocą polecenia. Z tego powodu niektórzy wolą zamiast tego używać zestawu lub torebek, aby nie dawały złudzenia, że ​​są zamówione. Chociaż to mówię, przez większość czasu będą wyglądać na widoczne w kolejności, ponieważ są dodawane do listy w kolejności, w jakiej znajdują się w zapytaniu, które uruchamia NHibernate.

Zestawy nie są domyślnie uporządkowane, nie można uzyskać dostępu do żadnej zmiennej bezpośrednio przez indeks. Zestawy są domyślnie jedynymi ADT z trzech powyższych, które zachowują wyjątkowość swoich obiektów . Są świetne, jeśli masz kolekcję, jeśli chcesz, aby nie zawierała duplikatów.

Torby (lub zestawy Multisets ) są, jak widać z powyższych linków, rodzajem zestawu, który pozwala obiektom w nim być duplikatami innych obiektów. Nie są one generalnie używane, ponieważ porządkowanie list można zignorować, a zatem traktować je jako torbę.

W odniesieniu do tego, jak są one używane w NHibernate, nic nie jest pobierane z bazy danych inaczej w zależności od tego, który ADT tutaj wybierzesz, to jest to, do czego chcesz go użyć, aby wybrać inny ADT.

Osobiście używam zestawów do większości rzeczy, ponieważ generalnie wymagam, aby obiekty podrzędne były unikalne, a porządkowanie nie stanowi problemu. Chociaż będę używał List, w których mam grupę obiektów, które chcę uporządkować według czegoś, na przykład czas, aby osiągnąć tę kolejność, muszę ręcznie ustawić „kolejność według” w zapytaniu HQL.

Sójka
źródło
2
Korekta na liście - użycie listy w pliku mapowania NHibernate BĘDZIE wymagało zmapowania kolumny indeksu. W ten sposób lista zostanie wyciągnięta dokładnie w takiej kolejności, w jakiej została umieszczona.
Michael Gattuso,
@Michael Gattuso Słuszna uwaga, powinienem był wspomnieć w powyższej odpowiedzi, że mówiłem o zapytaniach HQL (stąd komentarz „order by”), a nie o rzeczywistej specyfikacji kolekcji w pliku mapowania.
Jay
Jedną z zalet używania worków jest to, że nie trzeba ich ładować z bazy danych, gdy dodajesz do niej nowe elementy. Brak duplikatów do sprawdzenia, brak kolejności do ustalenia.
tvaananen
1

Cóż, podstawowa różnica polega na tym, że listy mają niejawne uporządkowanie elementów, indeksowane według ich pozycji na liście. Zestawy i worki mogą być również „zamawiane”, zwykle przez Porównawcę lub przez klauzulę porządkowanie według, która jest stosowana, gdy te elementy wychodzą z DB. Osobiście nigdy nie korzystałem z Torby ... jeśli wiem, że dane, których chcę, są uporządkowane sekwencyjnie, używam listy, w przeciwnym razie używam zestawu.

BryanD
źródło
0

Zestaw nie pozwala na posiadanie w nim powtarzających się elementów. Jeśli spróbujesz dodać jakiś nowy element, porówna on (użyta jest metoda Equals) każdy element, który jest już w kolekcji z tym, który dodajesz, a jeśli zostanie ponownie ustawiony jako prawdziwy, element nie zostanie dodany

Chytry
źródło