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

NHibernate QueryOver:在子查询中使用group by获取行计数,nhibernate,queryover,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 = _unitOfWo

我试图从带有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();
var query=\u unitOfWork.CurrentSession.QueryOver()
.Select(projects.Property(x=>x.Email),
预测组(x=>x.Email));
返回query.RowCount();
我不介意为此使用标准,但我对(对我来说)新的QueryOver API感到兴奋,它让我摆脱了神奇的字符串

更新:

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


请参阅:和(“不支持计数不同”,大约占页面的2/3)

我不确定您为什么需要如此复杂的查询。如果您只需要满足某些标准的不同电子邮件的数量,我认为您可以在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
int count=session.QueryOver()
.Select(projects.CountDistinct(x=>x.Email))
.未来价值()
.价值//直到这里才执行查询

除非我遗漏了什么,否则我想这会得到你想要的结果。还有一个“独特的”投影和一个.ToRowCountQuery()方法,您可能会对此感兴趣。

谢谢Alex,您是对的-这在SQL Server(可能还有其他数据库)中正常工作。但是,运行此功能的应用程序在某些情况下也使用SQL CE,无论出于何种原因,SQL CE都不支持select count(distinct x)。请参阅,我将此标记为正确答案,因为从技术上讲,只要您使用的是SQL Server,它就是正确答案。对于SQLCE,我必须使用内联SQL使其工作。