0

これは家を数回やった人だと確信していますが、解決策は見つかりませんでした...

したがって、できればLinqでnHibernate 3を使用して、このようなことを行うことは可能ですか:

SELECT   
COUNT(CASE WHEN IsWithdrawn = 1 THEN 1 END) AS WithdrawnCount, 
COUNT(CASE WHEN IsWithdrawn = 0 THEN 1 END) AS ViewAllCount
FROM Tutorials

それは不可能であり、最善の解決策はこの場合はSQLのみを選択することだと確信しています...しかし、nHibernate 3.1には、queryoverを使用してもこれを実行できる新しいものがあるかもしれません?

ありがとう

4

2 に答える 2

2

これは、SQLとほぼ同じHQLで実行できます。

SELECT   
SUM(CASE WHEN IsWithdrawn = 1 THEN 1 ELSE 0 END) AS WithdrawnCount, 
SUM(CASE WHEN IsWithdrawn = 0 THEN 1 ELSE 0 END) AS ViewAllCount
FROM Tutorials

(COUNTが機能するかどうかはわかりませんが、SUMが機能すると確信しています)

これも機能するはずのLINQバージョンです。

session.Query<Tutorial>()
       .GroupBy(x => x.IsWithdrawn)
       .Select(x => new { x.Key, Count = x.Count() })

Projections.ConditionalCriteriaまたはQueryOverで使用できますが、それはもっと手間がかかります。

于 2011-03-26T14:48:11.040 に答える
2

サブクエリのために遅くなりますが、QueryOver を使用して目的の結果を得ることができます。

var sums = repo.Session.QueryOver<Tutorials>()
    .SelectList(list => list
        .SelectSubQuery<Tutorials>(NHibernate.Criterion.QueryOver.Of<Tutorials>()
            .Where(t => t.IsWithdrawn)
            .ToRowCountQuery())
        .SelectSubQuery<Tutorials>(NHibernate.Criterion.QueryOver.Of<Tutorials>()
            .ToRowCountQuery())
    )
    .Take(1) // we want only one row in our result. In SQL I would use " from dummy".
    .List<object[]>();

説明:

分離された 2 つの QueryOver を使用します。1 つ目は IsWithDrawing = true であるチュートリアルの行をカウントし、2 つ目はすべての行を 1 回カウントします。切り離された 2 つの QueryOver は、Projection (SelectList) を使用して通常の QueryOver で SubQuery として使用されます。

生成された SQL は次のとおりです。

SELECT TOP (1) 
(SELECT count(*) as y0_ FROM [Tutorials] this_0_ 
WHERE this_0_.IsWithdrawn = True) as y0_, 
(SELECT count(*) as y0_ FROM [Tutorials] this_0_) as y1_ 
FROM [Tutorials] this_;
于 2011-03-24T22:33:29.710 に答える