NHibernate QueryOver:在子查询中获取group by的行计数

时间:2011-04-21 17:37:26

标签: nhibernate queryover

我正在尝试使用group by从查询中获取计数,并且无法弄清楚如何将我想要的SQL转换为NHibernate的QueryOver语法。

这是SQL:

select count(*) from
       (select Email from Entry
       where (conditions...)
       group by Email) as tmp

看似简单吧?

这就是我尝试这样做的方法,但RowCount()调用似乎完全彻底地优化了该组:

    var query = _unitOfWork.CurrentSession.QueryOver<ContestEntry>()
        .Select(Projections.Property<ContestEntry>(x => x.Email),
                Projections.Group<ContestEntry>(x => x.Email));

    return query.RowCount();

我不介意使用Criteria,但我很高兴新的(对我而言)QueryOver API可以让我摆脱魔法字符串。

更新

我无法使用在计数内执行不同查询的生成SQL(例如,选择计数(不同的电子邮件)),因为此应用程序在SQL CE上运行。

请参阅:http://social.msdn.microsoft.com/Forums/en-US/sqlce/thread/80a1d7dd-22be-4583-b8f2-fcd8cde5ec53/http://our.umbraco.org/wiki/install-and-setup/sql-server-ce-4-known-issues(“不支持计数不同”,约为页面的2/3)

1 个答案:

答案 0 :(得分:15)

我不确定为什么你需要这么复杂的查询。如果您只想要满足特定条件的不同电子邮件的数量,我认为您可以在SQL中使用类似的内容:

select count(distinct email)
from Entry
where (conditions...)

将其翻译成NHibernate的QueryOver API看起来像这样:

int count = session.QueryOver<ContestEntry>()
            .Select(Projections.CountDistinct<ContestEntry>(x => x.Email))
            .FutureValue<int>()
            .Value;//query is not executed until here

除非我遗漏了什么,否则我认为这会得到你所追求的结果。还有一个“Distinct”投影和.ToRowCountQuery()方法,您可能会感兴趣。

相关问题