在NHibernate中按绝对值排序

时间:2013-05-31 15:12:27

标签: hibernate nhibernate

我有一个Criteria查询,我需要通过查询来实现这个SQL顺序:

ORDER BY Name, DecimalColumn, ABS(DecimalNegativeColumn)

My Order By Criteria看起来像这样

var result = criteria
                .Add(conjunction)
                .AddOrder(new Order("Name", true))
                .AddOrder(new Order("DecimalColumn", true))
                .AddOrder(new Order("DecimalNegativeColumn", true))
                .List<MyClass>();

我该怎么办?

3 个答案:

答案 0 :(得分:3)

Radim的解决方案有效,但这个解决方案不需要额外的类:

.AddOrder(Order.Asc(Projections.SqlFunction(
    "abs", NHibernateUtil.Int32, Projections.Property("DecimalNegativeColumn"))))

我只是告诉NH通过abs函数投影DecimalNegativeColumn,该函数由Dialect定义。

答案 1 :(得分:1)

您可以在Order类中创建计算属性。只需使用Formula添加其他媒体资源即可。所以如果你使用Fluent NHibernate:

Map(t => t.AbsDecimalNegativeColumn).Formula("ABS(DecimalNegativeColumn)");

然后您可以像其他任何属性一样将此添加到Criteria

AddOrder(new Order("AbsDecimalNegativeColumn", true));

答案 2 :(得分:1)

这可能很容易。我们可以使用NHibernate附带的扩展性。在构建Criteria时,我们调用.AddOrder()并传递对象Order的实例。所以我们甚至可以通过 Custom

public class CustomOrder : Order
{
    public CustomOrder(string propertyName, bool ascending) 
        : base(propertyName, ascending) { }

    public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)
    {
        var sqlString = new SqlString(propertyName);
        return sqlString.Append(this.ascending ? " asc" : " desc");
    }
}

所以电话会是:

.AddOrder(new CustomOrder("Abs(DecimalNegativeColumn)", true))

或任何需要且有效的订单字符串而不是"Abs(DecimalNegativeColumn)"