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?
źródło
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?
Semantyka NHibernate:
Lista: uporządkowana kolekcja obiektów, dozwolone duplikaty. Użyj .NET IList
w kodzie. Kolumna indeksu będzie musiała zostać zmapowana w NHibernate.
Zestaw: nieuporządkowana kolekcja unikatowych obiektów, duplikaty nie są dozwolone. Użyj Iesi.Collection.ISet
w kodzie (NH przed v4) lub System.Collections.Generic.ISet
(NH v4 +). Ważne jest, aby zastąpić GetHashCode
i Equals
wskazać biznesową definicję duplikatu. Można sortować, definiując kolejność lub definiując funkcję porównującą, która daje SortedSet
wynik.
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.
ISet
zamiastIesi
?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
for
pętli nadforeach
pę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.
źródło
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.
źródło
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
źródło