Was ist der Unterschied zwischen einer Liste, einem Satz und einer Tasche in der NHibernate-Zuordnungsdatei? In welcher Beziehung stehen die einzelnen zu .NET-Sammlungen?
quelle
Was ist der Unterschied zwischen einer Liste, einem Satz und einer Tasche in der NHibernate-Zuordnungsdatei? In welcher Beziehung stehen die einzelnen zu .NET-Sammlungen?
NHibernate-Semantik:
Liste: Geordnete Sammlung von Entitäten, Duplikat erlaubt. Verwenden Sie ein .NET IList
im Code. Die Indexspalte muss in NHibernate zugeordnet werden.
Set: Ungeordnete Sammlung eindeutiger Entitäten, Duplikate nicht zulässig. Verwendung Iesi.Collection.ISet
in Code (NH vor v4) oder System.Collections.Generic.ISet
(NH v4 +). Es ist wichtig, die Geschäftsdefinition von Duplikaten zu überschreiben GetHashCode
und Equals
anzugeben. Kann durch Definieren einer Reihenfolge oder durch Definieren eines Vergleichers sortiert werden, was zu einem SortedSet
Ergebnis führt.
Tasche: Ungeordnete Liste von Entitäten, Duplikate erlaubt. Verwenden Sie ein .NET ICollection<T>
im Code. Die Indexspalte der Liste wird von NHibernate nicht zugeordnet und nicht berücksichtigt.
Alle diese Objekte in NHibernate sind genau die gleichen wie andere Implementierungen dieser abstrakten Datentypen (ADT). Ich war überrascht, wie schwierig es ist, Sets und Taschen online zu finden, da die Namen für andere Dinge häufig vorkommen. Deshalb habe ich hier einige Links und Beschreibungen aufgelistet.
Weitere Informationen finden Sie in den folgenden Abschnitten : Listen , Sets und Taschen
Die allgemeinen Regeln sind:
Listen sind standardmäßig geordnet. Verwenden Sie diese, wenn Sie ein Objekt anhand seines Index herausziehen möchten oder wenn Sie eine seltsame Vorliebe für for
Schleifen über foreach
Schleifen haben. Sie müssen nicht in der Reihenfolge darauf zugreifen, wie Sie es in einer verknüpften Liste benötigen würden . Dieses ADT erlaubt Duplikate.
Bitte beachten Sie! Obwohl Listen so geordnet sind, wie BryanD in seiner Antwort erwähnt hat, gibt es absolut nichts zu sagen, dass sie in der Reihenfolge sein müssen, die Sie von der Datenbank erwarten, wenn Sie eine HQL-Abfrage ausführen, es sei denn, Sie geben eine Reihenfolge per Befehl an. Aus diesem Grund verwenden manche Leute lieber Set oder Taschen, damit es nicht die Illusion gibt, bestellt zu werden. Obwohl ich dies sage, werden sie die meiste Zeit in einer sichtbaren Reihenfolge angezeigt, da sie der Liste in der Reihenfolge hinzugefügt werden, in der sie in der von NHibernate ausgeführten Abfrage gefunden wurden.
Sets sind nicht standardmäßig geordnet, Sie können nicht direkt über einen Index auf eine Variable zugreifen. Sets sind standardmäßig das einzige ADT unter den oben genannten drei, das die Eindeutigkeit seiner Objekte beibehält . Diese sind großartig, wenn Sie eine Sammlung haben, wenn Sie keine Duplikate enthalten möchten.
Taschen (oder Multisets ) sind, wie Sie den obigen Links entnehmen können, eine Art Set, mit dem die darin enthaltenen Objekte Duplikate anderer Objekte sein können. Diese werden im Allgemeinen nicht verwendet, da die Reihenfolge der Listen ignoriert und daher als Tasche behandelt werden kann.
In Bezug darauf, wie diese in NHibernate verwendet werden, wird nichts unterschiedlich aus der Datenbank abgerufen, je nachdem, welches ADT Sie hier auswählen. Wenn Sie es verwenden möchten, sollten Sie das unterschiedliche ADT auswählen.
Persönlich verwende ich Sets für die meisten Dinge, da im Allgemeinen untergeordnete Objekte eindeutig sein müssen und die Reihenfolge kein Problem darstellt. Obwohl ich Listen verwenden werde, in denen ich eine Gruppe von Objekten habe, die nach etwas geordnet werden sollen, z. B. nach Zeit, um diese Reihenfolge zu erreichen, muss ich die "Reihenfolge nach" in der HQL-Abfrage manuell festlegen.
Der Hauptunterschied besteht darin, dass Listen eine implizite Reihenfolge für die Elemente haben, die durch ihre Position in der Liste indiziert wird. Sets und Taschen können auch normalerweise von einem Komparator oder einer Order by-Klausel "bestellt" werden, die angewendet wird, wenn diese Artikel aus der Datenbank kommen. Persönlich habe ich noch nie Taschen verwendet ... Wenn ich weiß, dass die gewünschten Daten nacheinander sortiert sind, verwende ich List, andernfalls verwende ich Set.
Mit Set können Sie keine wiederholten Elemente enthalten. Wenn Sie versuchen, ein neues Element hinzuzufügen, wird jedes Element, das sich bereits in der Sammlung befindet, mit dem Element verglichen, das Sie hinzugefügt haben (wenn die Methode Equals verwendet wird). Wenn eines der Elemente true erneut ausführt, wird das Element nicht hinzugefügt
ISet
stattIesi
?