2011-12-17 13 views
5

Tôi cần phải đặt hàng kết quả trong bảng DB ChargeOperations trong hướng của riêng tôi bởi typeId. yêu cầu SQL là như thế này:Làm thế nào để sử dụng trường hợp và đặt hàng bằng 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 

Vì vậy, xin vui lòng, có thể bạn cho tôi một ví dụ về làm thế nào tôi có thể tạo xây dựng này.

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 

với QueryOver.

+0

là 'TypeId' giá trị phân biệt? bạn có cần phân trang không? – Firo

+0

Tôi không biết bạn có nghĩa là giá trị phân biệt đối xử. TypeId là một trường để sắp xếp. Tôi không cần Paging hoặc smth khác. Tôi biết làm thế nào để tạo ra nó với HQL, nhưng chúng tôi sử dụng queryOver ... –

Trả lời

2

Bạn có thể làm điều đó bằng cách sử dụng Projections.Conditional, cho mẫu:

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

thậm chí nó là câu hỏi rất cũ, để cho nó được câu trả lời :) Tôi chỉ không thể kiểm tra nó. –