2011-12-17 4 views
5

DBテーブルChargeOperationsの結果を自分の方向typeIdに注文する必要があります。 SQL要求は、このようなものです:Nhibernateでcase and order byを使用するには?

SELECT * FROM ChargeOperations co 
LEFT JOIN ShadowChargeOperations sco ON sco.ChargeOperationId=co.Id 
-- just exclude some extra data. 
WHERE sco.Id IS NULL 
ORDER BY 
CASE co.TypeId 
    WHEN 1 THEN 3 -- this is my order, which is different from id of type and can change 
    WHEN 2 THEN 1 
    WHEN 3 THEN 2 
    ELSE 4 
END, 
co.TypeId, 
co.CalculationAmount 

だから、あなたは私がこのような構成を作成する方法の例を与えることができますしてください。

CASE co.TypeId 
    WHEN 1 THEN 3 -- this is my order, which is different from id of type and can change 
    WHEN 2 THEN 1 
    WHEN 3 THEN 2 
    ELSE 4 

with QueryOver

+0

は '弁別値をTypeId'されますか?ページングが必要ですか? – Firo

+0

私は弁別者の価値としてあなたを知らない。 TypeIdはソート用のフィールドです。私はページングやその他の必要はありません。私はHQLでそれを作成する方法を知っていますが、queryOverを使用します... –

答えて

2

あなたはサンプルのため、Projections.Conditionalを使用してそれを行うことができます:

ChargeOperation itemAlias = null; 

var result = 
    session.QueryOver<ChargeOperation>(() => itemAlias) 
      .Where (/*your conditions*/) 
      .OrderBy(Projections.Conditional(
         Restrictions.Where(() => itemAlias.TypeId == 1), 
         Projections.Constant(3),         
        Projections.Conditional(
         Restrictions.Where(() => itemAlias.TypeId == 2), 
         Projections.Constant(1), 
        Projections.Conditional(
         Restrictions.Where(() => itemAlias.TypeId == 3), 
         Projections.Constant(2), 
         ) 
        )   
       )       
      ).Asc 
      .ThenBy(x => x.TypeId) 
      .ThenBy(x => x.CalculationAmount) 
     .List(); 
+0

でもそれは非常に古い質問です、それは答えになる:)私はそれを確認することはできません。 –

関連する問題