2009-04-14 17 views
6

cuenta los siguientes criterios de consulta:Caso insensible ordenamiento especie en NHibernate

var x = SomeCriteria.AddOrder (nueva Orden ("Nombre", true)) lista();.

Esto ordenar el conjunto de resultados por la propiedad Name, pero entre mayúsculas y minúsculas:

"A1" 
"B1" 
"a2" 

Alguna idea de cómo añadir el caso de orden de modo insensible resultar "a2" acabará antes "B1"?

Respuesta

10

Debería poder lograr esto ordenando una proyección que normalice el caso para usted. Por ejemplo, Oracle tiene una función "inferior" que reducirá los tipos de datos de cadenas de casos como varchar2 y nvarchar2; entonces usaré esta función sql para formar una proyección que ordenará apropiadamente.

 
var projection = Projections.SqlFunction("lower", 
             NHibernateUtil.String, 
             Projections.Property("Name")); 

var x = SomeCriteria.AddOrder(Orders.Asc(projection)).List() 

Si está utilizando SQL Server, le recomendaría usar la función "superior" en lugar de "bajar" para mayor eficiencia. Microsoft ha optimizado su código nativo para realizar comparaciones en mayúsculas, donde el resto del mundo parece haberse optimizado en minúsculas.

+0

+1 para la nota sobre la optimización "superior" de SQL Server;) gracias. –

+0

Esto es asombroso. Sin embargo, cuando estoy ordenando en una grilla, no sé el tipo de columna. ¿Sabes si de alguna manera puedo detectar el tipo de columna y solo aplicar esta proyección a las cadenas? – Mac

2

Hibernate (Java) tiene un método "ignoreCase()" en la clase "Order", pero parece que NHibernate no tiene este método en su "Pedido".

Ésta es la forma en que estaba pensando que podría hacerlo:

var x = SomeCriteria.AddOrder(new Order("Name", true).IgnoreCase()).List(); 

Pero, por desgracia, no hay IgnoreCase().

Como solución alternativa, puede utilizar una consulta HQL o SQL; cualquiera de estas opciones le permitirá realizar pedidos sin tener en cuenta las mayúsculas y minúsculas.

+0

Mientras tanto, esto funciona en NHibernate :-) –

2

Esto probablemente depende de una configuración de sensibilidad de mayúsculas y minúsculas en su servidor de base de datos. Sospecho que NHibernate simplemente emite una cláusula "ORDER BY"; al menos, no puedo imaginar qué más haría. Para SQL Server, el orden de clasificación predeterminado (intercalación) es orden de diccionario, no distingue entre mayúsculas y minúsculas.

This article proporciona algunas técnicas para realizar búsquedas sensibles a mayúsculas y minúsculas en SQL Server. Sin embargo, mi consejo es ordenar la lista que devuelve la consulta en el código. Esa solución preserva la independencia de la base de datos de NHibernate y le permite personalizar el orden según sus necesidades.

+1

-1 ¿Está sugiriendo seriamente que omita la ordenación de base de datos optimizada y utilice la ordenación en su código? ¿Ha probado esa solución en el sistema de producción para el rendimiento? –

+0

Sí y sí. ¿Tienes? Sin más detalles en la pregunta original (RDBMS en uso, número de filas esperadas) es imposible sopesar la ventaja de clasificar el código (flexible, dinámico, independiente de la base de datos) frente a la clasificación en el servidor. La independencia de la base de datos es una razón principal para usar un asignador O/R y, por lo general, vale la pena conservarlo en una aplicación. –

0

Como sé que las respuestas a mi consulta son siempre bastante pequeñas, terminé consultando los datos como normales y ordenándolos luego usando Linq. Funciona, entonces ¿por qué molestarse en ajustar NHibernate?) (Usando SQLite, por cierto)

Cuestiones relacionadas