考虑以下标准查询:
var x = SomeCriteria.AddOrder(new Order(“Name”,true))。List();
这将按名称属性对结果集进行排序,但区分大小写:
"A1"
"B1"
"a2"
任何想法如何添加订单不区分大小写,结果“a2”将在“B1”之前结束?
答案 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,顺便说一句)