NHibernate中不区分大小写的排序顺序

时间:2009-04-14 06:23:41

标签: c# nhibernate

考虑以下标准查询:

var x = SomeCriteria.AddOrder(new Order(“Name”,true))。List();

这将按名称属性对结果集进行排序,但区分大小写:

"A1"
"B1"
"a2"

任何想法如何添加订单不区分大小写,结果“a2”将在“B1”之前结束?

4 个答案:

答案 0 :(得分:10)

您应该能够通过订购投影来完成此操作,该投影可为您规范化案例。例如,Oracle有一个“低级”函数,它将降低大小写字符串数据类型,如varchar2和nvarchar2;所以我将使用这个sql函数来形成一个适当排序的投影。

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

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

如果你正在使用SQL Server,我建议使用“upper”函数而不是“lower”来提高效率。 Microsoft已优化其本机代码以执行大写比较,其中世界其他地方似乎已针对小写进行了优化。

答案 1 :(得分:2)

Hibernate(Java)在“Order”类上有一个“ignoreCase()”方法,但看起来NHibernate在其“Order”上没有这个方法。

这就是我认为你可以做到的:

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

但不幸的是,没有IgnoreCase()。

作为一种变通方法,您可以使用HQL或SQL查询 - 其中任何一个都应该允许您对不区分大小写进行排序。

答案 2 :(得分:2)

这可能取决于数据库服务器上的区分大小写设置。我怀疑NHibernate只发出一个“ORDER BY”子句;至少,我无法想象它会做什么。对于SQL Server,默认排序顺序(排序规则)是字典顺序,不区分大小写。

This article提供了一些在SQL Server中执行区分大小写搜索的技术。但是,我的建议是在代码中对查询返回的列表进行排序。该解决方案保留了NHibernate的数据库独立性,让您根据需要自定义排序顺序。

答案 3 :(得分:0)

据我所知,对我的查询的响应总是很小,我最终查询数据正常,然后使用Linq对它们进行排序。它有效,所以为什么还要调整NHibernate;)(使用SQLite,顺便说一句)