Liste vs Set vs Tasche in NHibernate

109

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?

mrblah
quelle

Antworten:

230

NHibernate-Semantik:

  1. Liste: Geordnete Sammlung von Entitäten, Duplikat erlaubt. Verwenden Sie ein .NET IListim Code. Die Indexspalte muss in NHibernate zugeordnet werden.

  2. Set: Ungeordnete Sammlung eindeutiger Entitäten, Duplikate nicht zulässig. Verwendung Iesi.Collection.ISetin Code (NH vor v4) oder System.Collections.Generic.ISet(NH v4 +). Es ist wichtig, die Geschäftsdefinition von Duplikaten zu überschreiben GetHashCodeund Equalsanzugeben. Kann durch Definieren einer Reihenfolge oder durch Definieren eines Vergleichers sortiert werden, was zu einem SortedSetErgebnis führt.

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

Michael Gattuso
quelle
Betreff: # 2, können wir nicht einfach regulär ISetstatt Iesi?
Sergei Tachenov
@SergeyTachenov: Eine mögliche Antwort finden Sie unter stackoverflow.com/questions/9222058/… . Als diese Antwort geschrieben wurde, war ISet kein Teil von .net
Michael Gattuso
Die am wenigsten verbreitete Antwort auf diese Frage lautet Ja, seit NHibernate 4. Vielleicht muss diese Frage auch bearbeitet werden.
Sergei Tachenov
21

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 forSchleifen über foreachSchleifen 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.

Jay
quelle
2
Korrektur der Liste - Für die Verwendung einer Liste in einer NHibernate-Zuordnungsdatei muss eine Indexspalte zugeordnet werden. Auf diese Weise wird die Liste in der genauen Reihenfolge herausgezogen, in der sie
Michael Gattuso
@ Michael Gattuso Guter Punkt, ich hätte in der obigen Antwort erwähnen sollen, dass ich eher über HQL-Abfragen (daher der Kommentar "Reihenfolge nach") als über die tatsächliche Sammlungsspezifikation in Ihrer Zuordnungsdatei gesprochen habe.
Jay
Ein Vorteil der Verwendung von Taschen besteht darin, dass sie nicht aus der Datenbank geladen werden müssen, wenn Sie neue Elemente hinzufügen. Keine zu überprüfenden Duplikate, keine zu bestimmende Reihenfolge.
Tvaananen
1

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.

BryanD
quelle
0

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

Schlau
quelle