0

我正在寻找一种在 NHibernate 中模拟以下查询的方法......

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

我需要获取用户的唯一报告运行总数以及用于分页查询的报告。问题是 HQL 不允许在 from 子句中使用子查询,我认为 Criteria/QueryOver 也不可能。一种可能的解决方案是将两列配对并执行count(distinct pair_report_user_ids),但这似乎是一种 hack。您能想出另一种方法来获取总数,而无需获取整个子查询结果并计算返回的行数吗?

我想我找到了一种方法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 回答