2012-03-19 17 views
5

私はこのSQLコードNHibernateのでは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 

と同等のものをやろうとしています。

は、これまでのところ私は

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

を試みたが、これは私に次のエラーを与える:

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

あなたが任意のアイデアを持っていますか?

EDIT 1:私は2つのクエリで結果を得ることができますが、私は1つだけのクエリでこれをやりたいです。

EDIT 2:ここではQueryOverを使用しています。

+0

を。 – yoozer8

+0

件数は条件を受け付けていません。ここでどのように使用できますか? 2つのクエリ? –

+0

クエリを受け入れない場合は、WHEREを使用してカウントしたいものだけを選択してから、COUNTを使用します。 – yoozer8

答えて

14

私は、これは(QueryOver構文を)動作するはずだと思う:

あなたは、次のSQL与えるべき
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)))); 

:あなたはおそらく代わりに `SUM`の` COUNT`を使用する必要があるように見えます

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

代わりにQueryOverを使用した場合の表示方法をご存知ですか? –

+0

@AlexeyZimarev:上記のコードは* QueryOver ... –

+0

Projections.Sumの代わりにProjections.Group、SelectSumの代わりにSelectGroupを使用しているので、インライン構文のQueryOverで精度が –