2

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

ORDER BY Name, DecimalColumn, ABS(DecimalNegativeColumn)

我的按标准排序看起来像这样

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

我能做些什么?

4

3 回答 3

3

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

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

我只是告诉 NH 通过abs函数来​​投影 DecimalNegativeColumn,该函数由Dialect.

于 2013-06-01T13:23:38.713 回答
1

Order您可以在类中创建计算属性。只需使用 . 添加另一个属性Formula。因此,如果您使用的是 Fluent NHibernate:

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

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

AddOrder(new Order("AbsDecimalNegativeColumn", true));
于 2013-05-31T18:11:10.433 回答
1

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

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)"

于 2013-05-31T18:27:14.817 回答