【问题标题】:Keep null values last in nhibernate sorting在休眠排序中保持空值最后
【发布时间】:2012-11-20 12:18:47
【问题描述】:

无论排序顺序如何(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

更新

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

【问题讨论】:

    标签: asp.net-mvc-3 nhibernate


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

    【讨论】:

    • 实际上通过这样做,我在排序时不必担心空值。空值应始终排在最后。希望你明白我的意思。如果我按照你的回答会发生这种情况吗?
    • 如果我理解正确,你必须(按照我的回答)做一些if 声明。如果 Order by 应该是 ASC,那么要放下 null,我们必须将它们转换为一些高值(例如 char 'Z' 或十进制转换为 '999999')。在DESC 的情况下,它必须替换为一些低值。另一方面,这适用于任何数据库引擎。
    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 2013-11-28
    • 2012-08-26
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    相关资源
    最近更新 更多