在nhibernate排序中保持空值最后

时间:2012-11-15 09:36:23

标签: asp.net-mvc-3 nhibernate

我必须在排序时始终保持空值,不管排序顺序(asc或desc)。

我使用的代码是这样的。

criteria
   .AddOrder(Order.Desc(
          Projections.Cast(
                 NHibernateUtil.Decimal, 
                 Projections.Property("col1"))));

criteria
     .AddOrder(Order.Asc(
           Projections.Cast(
                 NHibernateUtil.Decimal, 
                 Projections.Property("col1"))));

我已阅读此链接:

http://www.techrepublic.com/blog/datacenter/control-null-data-in-oracle-using-the-order-by-clause/121

更新

在此链接中,您可以看到 nulls last 进行排序。我如何在上面的代码中实现这个nhibernate? 有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

我们可以使用标准SQL函数COALESCE并将其用作ORDER BY

的投影
using NHibernate.Dialect.Function;
using NHibernate.Criterion;
...

// sql function definition
var sqlFunction = new SQLFunctionTemplate(NHibernateUtil.String
                                         , "COALESCE(Col1, 'zzzz')");
// create projection
var projection = Projections.SqlFunction(sqlFunction, NHibernateUtil.String);

// order by projection
criteria.AddOrder(new Order(projection, false));

这取决于您的需求NULL将如何替换('zzzzz'或'000'或..)以在结尾或开头移动它。因此,如果订单是升序投影将使用高字符,如果下降低字符。虽然有一些开销,但它会完成这项工作