2012-03-19 30 views
5

Tôi đang cố gắng để làm tương đương của Bộ luật SQL nàyLàm thế nào để thực hiện Sum có điều kiện với Nhibernate?

SELECT 
ID 
SUM(CASE WHEN myProperty = 2 THEN 1 ELSE 0 END) as nbRowWithValueOf2, 
SUM(CASE WHEN myProperty = 3 THEN 1 ELSE 0 END) as nbRowWithValueOf3 
FROM Foo 
GROUP BY ID 

Với Nhibernate.

Cho đến nay tôi đã cố gắng

queryable = queryable 
    .Select(
     Projections.Group<Foo>(c => c.ID), 
     Projections.Sum<Foo>(c => c.myProperty == MyEnum.Two ? 1 : 0) 
     Projections.Sum<Foo>(c => c.myProperty == MyEnum.Three ? 1 : 0) 
) 

Nhưng điều này mang lại cho tôi những lỗi sau:

Could not determine member from IIF((Convert(c.myProperty) = 2), 1, 0)

Bạn có bất cứ ý tưởng?

EDIT 1: Tôi có thể nhận được kết quả với 2 truy vấn nhưng tôi muốn thực hiện điều này chỉ trong 1 truy vấn.

CHỈNH SỬA 2: Tôi đang sử dụng QueryOver tại đây.

+0

Dường như bạn có lẽ nên sử dụng 'COUNT' thay vì' SUM' . – yoozer8

+0

Đếm không chấp nhận các điều kiện, làm thế nào tôi có thể sử dụng nó ở đây? Hai truy vấn? –

+0

Nếu nó không chấp nhận truy vấn, bạn có thể sử dụng 'WHERE' để chỉ chọn những cái bạn muốn đếm, và sau đó sử dụng' COUNT'. – yoozer8

Trả lời

14

Tôi nghĩ rằng điều này sẽ làm việc (QueryOver cú pháp):

queryover = queryover 
    .Select(
     Projections.Group<Foo>(c => c.ID), 
     Projections.Sum(
      Projections.Conditional(
       Restrictions.Where<Foo>(f => f.myProperty == MyEnum.Two), 
       Projections.Constant(1), 
       Projections.Constant(0))), 
     Projections.Sum(
      Projections.Conditional(
       Restrictions.Where<Foo>(f => f.myProperty == MyEnum.Three), 
       Projections.Constant(1), 
       Projections.Constant(0)))); 

Mà nên cung cấp cho bạn các SQL sau:

SELECT this_.ID as y0_, 
     sum((case 
       when this_.myProperty = 2 /* @p0 */ then 1 /* @p1 */ 
       else 0 /* @p2 */ 
      end))    as y1_, 
     sum((case 
       when this_.myProperty = 3 /* @p3 */ then 1 /* @p4 */ 
       else 0 /* @p5 */ 
      end))    as y2_ 
FROM [Foo] this_ 
GROUP BY this_.ID 
+0

Bạn có biết nó sẽ trông như thế nào nếu tôi sử dụng QueryOver thay thế? –

+0

@AlexeyZimarev: Mã ở trên * là * QueryOver ... –

+0

Tôi muốn sử dụng SelectGroup thay vì Projections.Group, SelectSum thay vì Projections.Sum và cứ như vậy, vì vậy QueryOver với cú pháp nội tuyến chính xác với các điều khoản –

Các vấn đề liên quan