我有一个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>();
我该怎么办?
答案 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)"