2011-12-17 4 views
5

Necesito ordenar el resultado en la tabla DB ChargeOperations en mi propia dirección por typeId. El petición SQL es la siguiente:¿Cómo usar el caso y ordenarlo en Nhibernate?

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 

Así que, por favor, ¿me puede dar un ejemplo de cómo puedo crear esta construcción.

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 

con QueryOver.

+0

es 'TypeId' el valor discriminador? ¿necesitas Paginación? – Firo

+0

No sé tu significado como valor discriminador. TypeId es un campo para clasificar. No necesito Paging ni nada más. Sé cómo crearlo con HQL, pero utilizamos queryOver ... –

Respuesta

2

Usted puede hacerlo utilizando el Projections.Conditional, por ejemplo:

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

, incluso son preguntas muy antiguas, que sea la respuesta :) Simplemente no puedo verificarlo. –

Cuestiones relacionadas