0

无论排序顺序(asc 或 desc)如何,我都必须将 null 值始终保持在排序的最后。

我使用了类似这样的代码。

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

更新

在此链接中,您可以看到最后一个用于排序的空值。我如何在上面的代码中在 nhibernate 中实现这一点?有什么帮助吗?

4

1 回答 1

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”或..)以在末尾或开头移动它。因此,如果订单是升序,则投影将使用高字符,如果降序低字符。虽然有一些开销,但它会完成这项工作

于 2012-11-15T19:13:06.837 回答