Search code examples
c#queryovernhibernate-3

How to do a conditional Sum with Nhibernate?


I'm trying to do the equivalent of this SQL Code

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

With Nhibernate.

So far I tried

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

But this gives me the following error:

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

Do you have any idea ?

EDIT 1 : I can get the result with 2 queries but I want to do this in only 1 query.

EDIT 2 : I'm using QueryOver here.


Solution

  • I think this should work (QueryOver syntax):

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

    Which should give you the following SQL:

    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