0

NHibernate で次のクエリをエミュレートする方法を探しています...

select total = count(*) from (
    select userId, reportId
    from RunHistory 
    where runDate >= @d
    group by userId, reportId
) t

ページクエリで使用するために、ユーザーとレポートの一意のレポート実行の合計数を取得する必要があります。問題は、HQL が from 句でサブクエリを許可していないことです。Criteria/QueryOver でも可能だとは思いません。考えられる解決策の 1 つは、2 つの列をペアにして を実行するcount(distinct pair_report_user_ids)ことですが、それはハックのようです。サブクエリの結果全体をフェッチして返された行をカウントせずに合計を取得する別の方法を考えられますか?

私は方法を見つけたと思います.aをcount(*) over()複数列の集計クエリに追加し、最初の行のみを選択してください!

select top 1 userId, reportId, total = count(*) over()
from RunHistory 
where runDate >= @d
group by userId, reportId
4

1 に答える 1

0

count(*) overこれは、 SQL関数を使用した方言固有のQueryOverソリューションです...

var countOverFunction = new NoArgSQLFunction("count(*) over", NHibernateUtil.Int32, true);

UserReportRunHistoryResult dto = null;

var result = s.QueryOver<RunHistory>()
    .SelectList(list => list
        .SelectGroup(x => x.user.id).WithAlias(() => dto.userId)
        .SelectGroup(x => x.report.id).WithAlias(() => dto.reportId)
        .Select(Projections.SqlFunction(countOverFunction, NHibernateUtil.Int32)).WithAlias(() => dto.total))
    .TransformUsing(Transformers.AliasToBean<UserReportRunHistoryResult>())
    .Take(1)
    .SingleOrDefault<UserReportRunHistoryResult>();
于 2013-03-28T18:44:24.523 に答える