Lista vs Set vs Bag en NHibernate

109

¿Cuál es la diferencia entre una lista, un conjunto y una bolsa en el archivo de mapeo NHibernate? ¿Cómo se relaciona cada uno con las colecciones .NET?

mrblah
fuente

Respuestas:

230

Semántica NHibernate:

  1. Lista: colección ordenada de entidades, se permiten duplicados. Utilice un .NET IListen el código. La columna de índice deberá mapearse en NHibernate.

  2. Conjunto: colección desordenada de entidades únicas, no se permiten duplicados. Úselo Iesi.Collection.ISeten el código (NH antes de v4) o System.Collections.Generic.ISet(NH v4 +). Es importante anular GetHashCodee Equalsindicar la definición empresarial de duplicado. Se puede ordenar definiendo un orden por o definiendo un comparador que dé como resultado un SortedSetresultado.

  3. Bolsa: Lista desordenada de entidades, se permiten duplicados. Utilice un .NET ICollection<T>en el código. La columna de índice de la lista no está mapeada ni respetada por NHibernate.

Michael Gattuso
fuente
Re: # 2, ¿no podemos usar solo regular en ISetlugar de Iesi?
Sergei Tachenov
@SergeyTachenov: consulte stackoverflow.com/questions/9222058/… para una posible respuesta. Cuando se escribió esta respuesta, ISet no era parte de .net
Michael Gattuso
La respuesta menos popular a esa pregunta es sí, desde NHibernate 4. Así que quizás esta pregunta también necesite ser editada.
Sergei Tachenov
21

Todos estos objetos en NHibernate son exactamente iguales que otras implementaciones de estos tipos de datos abstractos (ADT). Me sorprendió lo difícil que es encontrar conjuntos y bolsas en línea debido a lo comunes que son los nombres para otras cosas, por lo que he enumerado algunos enlaces y descripciones aquí.

Para obtener información más detallada, consulte lo siguiente: Listas , juegos y bolsas

Las reglas generales son:

Las listas están ordenadas por defecto, utilícelas si desea poder extraer un objeto por su índice o si le gustan los forbucles sobre los foreachbucles. No es necesario que acceda a ellos en el orden en que lo haría en una lista vinculada . Este ADT permite duplicados.

¡Tenga en cuenta! Aunque las listas están ordenadas como BryanD mencionó en su respuesta, no hay absolutamente nada que diga que tiene que estar en el orden que espera de la base de datos cuando ejecuta una consulta HQL a menos que especifique un orden por comando. Es por esto que a algunas personas les gusta usar Set o Bags en su lugar, para que no dé la ilusión de estar ordenado. Aunque digo esto, la mayoría de las veces aparecerán en un orden visible, ya que se agregan a la lista en el orden en que se encuentran en la consulta que ejecuta NHibernate.

Los conjuntos no están ordenados por defecto, no puede acceder a ninguna variable directamente a través de un índice. Los conjuntos son por defecto el único ADT de los tres anteriores que mantienen la singularidad de sus objetos . Estos son excelentes si tiene una colección si necesita que no contenga duplicados.

Las bolsas (o conjuntos múltiples ) son, como puede ver en los enlaces anteriores, un tipo de conjunto que permite que los objetos dentro de él sean duplicados de otros objetos. Estos no se utilizan generalmente, ya que el orden de las listas se puede ignorar y, por lo tanto, se tratan como una bolsa.

En relación a cómo se usan estos en NHibernate, nada se extrae de la base de datos de manera diferente dependiendo de qué ADT seleccione aquí, es para lo que desea usarlo lo que debería hacer que elija los diferentes ADT.

Personalmente, utilizo Sets para la mayoría de las cosas, ya que generalmente requiero que los objetos secundarios sean únicos y el orden no es un problema. Aunque usaré Listas donde tenga un grupo de objetos que quiero ordenar por algo, por ejemplo, el tiempo, para lograr este orden, necesito establecer manualmente el "orden por" en la consulta HQL.

Arrendajo
fuente
2
Corrección en la lista: usar una lista en un archivo de mapeo NHibernate requerirá mapear una columna de índice. De esta manera, la lista se extraerá en el orden exacto en que se colocó.
Michael Gattuso
@Michael Gattuso Buen punto, debería haber mencionado en la respuesta anterior que estaba hablando de consultas HQL (de ahí el comentario 'ordenar por') en lugar de la especificación de la colección real en su archivo de mapeo.
Jay
Un beneficio de usar bolsas es que no tienen que cargarse desde la base de datos cuando le agregas nuevos elementos. No hay duplicados para verificar, no hay orden para determinar.
tvaananen
1

Bueno, la principal diferencia es que las listas tienen un orden implícito de los elementos, indexados por su posición en la lista. Los juegos y bolsas también pueden ser "ordenados" generalmente por un Comparador o una cláusula de orden por que se aplica cuando esos artículos salen del DB. Personalmente, nunca he usado Bags ... si sé que los datos que quiero están ordenados secuencialmente, uso List; de lo contrario, uso Set.

BryanD
fuente
0

Establecer no le permite tener elementos repetidos en él. Si intenta agregar algún elemento nuevo, comparará (se usa el método Equals) cada elemento que ya está en la colección con el que está agregando, y si uno devuelve verdadero, el elemento no se agregará

Astuto
fuente