web-dev-qa-db-fra.com

List vs Set vs Bag dans NHibernate

Quelle est la différence entre une liste, un ensemble et un sac dans le fichier de mappage NHibernate? Comment chacun se rapporte-t-il aux collections .NET?

102
mrblah

Sémantique NHibernate:

  1. Liste: collection ordonnée d'entités, copie autorisée. Utilisez un .NET IList dans le code. La colonne d'index devra être mappée dans NHibernate.

  2. Ensemble: collection non ordonnée d'entités uniques, les doublons ne sont pas autorisés. Utilisation Iesi.Collection.ISet dans le code (NH avant v4) ou System.Collections.Generic.ISet (NH v4 +). Il est important de remplacer GetHashCode et Equals pour indiquer la définition commerciale du doublon. Peut être trié en définissant une commande par ou en définissant un comparateur résultant en un résultat SortedSet.

  3. Sac: liste non ordonnée des entités, doublons autorisés. Utilisez un .NET ICollection<T> dans du code. La colonne d'index de la liste n'est pas mappée et n'est pas honorée par NHibernate.

221
Michael Gattuso

Tous ces objets dans NHibernate sont exactement les mêmes que les autres implémentations de ces types de données abstraits (ADT). J'ai été surpris de voir à quel point il est difficile de trouver des ensembles et des sacs en ligne en raison de la fréquence des noms pour d'autres choses, j'ai donc énuméré quelques liens et descriptions ici.

Pour plus d'informations, consultez les informations suivantes: Listes , Sets and Bags

Les règles générales sont les suivantes:

Les listes sont ordonnées par défaut, utilisez-les si vous voulez pouvoir extraire un objet par son index ou si vous avez un penchant étrange pour for boucle sur foreach boucles. Vous n'êtes pas obligé d'y accéder dans l'ordre comme vous en auriez besoin dans une liste liée . Cet ADT permet les doublons.

S'il vous plaît noter ! Bien que les listes soient ordonnées comme BryanD l'a mentionné dans sa réponse, rien ne dit que cela doit être dans l'ordre auquel vous vous attendez la base de données lorsque vous exécutez une requête HQL, sauf si vous spécifiez une commande par commande. C'est pour cette raison que certaines personnes aiment utiliser Set ou Bags à la place, afin que cela ne donne pas l'illusion. d'être ordonné. Bien que je dis cela, la plupart du temps, ils apparaîtront dans un ordre visible, car ils sont ajoutés à la liste dans l'ordre où ils se trouvent dans la requête exécutée par NHibernate.

Les ensembles ne sont pas commandés par défaut, vous ne pouvez accéder à aucune variable directement via Un index. Les ensembles sont par défaut les ADT uniquement parmi les trois ci-dessus qui maintiennent l'unicité de ses objets . Ils sont parfaits si vous avez une collection si vous souhaitez ne pas contenir de doublons.

Les sacs (ou Multisets) sont, comme vous pouvez le voir sur les liens ci-dessus, un type d'ensemble qui permet les objets qu'il contient sont des doublons d'autres objets. Ceux-ci ne sont généralement pas utilisés, car la commande de listes peut être ignorée et donc traitée comme un sac.

En ce qui concerne la façon dont ceux-ci sont utilisés dans NHibernate, rien n'est extrait de la base de données différemment selon l'ADT que vous sélectionnez ici, c'est la raison pour laquelle vous voulez l'utiliser, cela devrait vous faire choisir les différents ADT.

Personnellement, j'utilise des ensembles pour la plupart des choses, car j'ai généralement besoin que les objets enfants soient uniques et la commande n'est pas un problème. Bien que j'utilise des listes où j'ai un groupe d'objets que je veux ordonner par quelque chose, par exemple le temps, pour atteindre cet ordre, je dois définir manuellement l '"ordre par" dans la requête HQL.

21
Jay

Eh bien, la principale différence est que les listes ont un ordre implicite des éléments, indexés par leur position dans la liste. Les ensembles et les sacs peuvent également être "commandés" généralement par un comparateur ou par une clause de commande qui s'applique lorsque ces articles sortent de la base de données. Personnellement, je n'ai jamais utilisé de sacs ... si je sais que les données que je veux sont commandées séquentiellement, j'utilise List sinon j'utilise Set.

1
BryanD

Set not vous permet d'avoir des éléments répétés dedans. Si vous essayez d'ajouter un nouvel élément, il comparera (la méthode Equals est utilisée) chaque élément qui est déjà en collection avec celui que vous ajoutez, et si l'on revient vrai, l'élément ne sera pas ajouté

0
Sly