Как сделать условную сумму с Nhibernate? - PullRequest
6 голосов
/ 19 марта 2012

Я пытаюсь сделать эквивалент этого кода SQL

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

С Nhibernate.

Пока я пытался

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

Но это дает мнеследующая ошибка:

Не удалось определить член из IIF ((Convert (c.myProperty) = 2), 1, 0)

У вас есть идеи?

РЕДАКТИРОВАТЬ 1: я могу получить результат с 2 запросами, но я хочу сделать это только за 1 запрос.

РЕДАКТИРОВАТЬ 2: Я использую QueryOver здесь.

1 Ответ

14 голосов
/ 19 марта 2012

Я думаю, что это должно работать (синтаксис QueryOver):

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

Что должно дать вам следующий 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
...