2013-05-31 103 views
2

絕對值我有一個條件查詢,我需要通過查詢來實現這個SQL命令:訂購NHibernate的

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>(); 

我能做些什麼?

+0

我敢打賭,你不能在不使用sql/hql的情況下執行此操作,或者在返回後對列表進行排序。 Hibernate有時可能會跛腳。 – NimChimpsky

+0

這太糟糕了... –

回答

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

+0

簡單而優雅...這就是爲什麼我喜歡NHibernate –

+0

它實際上比這更容易。你可以使用SqlProjection。沒有課堂需要。 –

+0

@AgustinMeriles偉大的,如果這有幫助;)順便說一句我喜歡你的觀點,這就是爲什麼我喜歡NHibernate;);) –

1

您可以在Order類中創建一個計算屬性。只需使用Formula添加另一個物業。所以,如果你正在使用功能NHibernate:

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

然後你就可以像任何其他屬性添加到您的Criteria

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

拉迪姆的解決方案作品,但這一個不需要額外的類別:

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

我只是告訴NH通過abs函數投影DecimalNegativeColumn,該函數由Dialect定義。

+0

不錯,真的很好的解決方案 –

+0

真的很不錯的功能。感謝這個人。 –