Lista vs Conjunto vs Bolsa en NHibernate


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

 96
Author: Mani Gandham, 2009-12-16

4 answers

Semántica nhibernate:

  1. Lista: Colección ordenada de entidades, duplicados permitidos. Utilice un. NET IList en el código. La columna índice tendrá que ser mapeada en NHibernate.

  2. Conjunto: Colección desordenada de entidades únicas, no se permiten duplicados. Utilice Iesi.Collection.ISet en el código (NH antes de v4) o System.Collections.Generic.ISet (NH v4+). Es importante anular GetHashCode y Equals para indicar la definición comercial de duplicado. Se puede ordenar definiendo un orderby o definiendo un comparador resultando en un resultado SortedSet.

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

 217
Author: Michael Gattuso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-28 10:23:42

Todos estos objetos en NHibernate son exactamente los mismos 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, así que he enumerado algunos enlaces y descripciones aquí.

Para obtener información más detallada, eche un vistazo a lo siguiente: Listas , Conjuntos y Bolsas

Las reglas generales son:

Las listas están ordenadas por defecto, use estos si desea poder extraer un objeto por su índice o si tiene una extraña afición a los bucles for sobre los bucles foreach. No está obligado a acceder a ellos en orden como 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 se especifica un orden por comando. Es por esto que a algunas personas les gusta usar Set o Bolsas en su lugar, para que no dé la ilusión de ser ordenado. Aunque digo esto, la mayoría de las veces parecerán estar 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 son no por defecto ordenados, no se puede acceder a ninguna variable directamente a través de un índice. Los conjuntos son por defecto los solo ADT de los tres anteriores que mantienen la singularidad de sus objetos. Estos son excelentes si tiene una colección si necesita no contener duplicados.

Bags (o Multisets) son, como se 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 usan generalmente, ya que el pedido de listas puede ser ignorado, y por lo tanto tratado como una Bolsa.

En relación con cómo se utilizan 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 que debe hacer que elija el ADT diferente.

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

 20
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-19 10:42:46

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 conjuntos y bolsas también pueden ser "ordenados" generalmente por un Comparador o una cláusula order by que se aplica cuando esos artículos salen de la base de datos. Personalmente, nunca he usado bolsas ... si sé que los datos que quiero están ordenados secuencialmente utilizo List de lo contrario utilizo Set.

 1
Author: BryanD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-16 17:50:46

Set not le permite tener elementos repetidos en él. Si intenta agregar algún elemento nuevo, comparará (se usa el método Igual) cada elemento que ya está en la colección con el que agrega, y si vuelve a ejecutar true, el elemento no se agregará

 0
Author: Sly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-16 21:32:55