NHibernate QueryOver<> - SubQuery上的聚合函数

时间:2011-08-03 18:23:23

标签: c# sql nhibernate queryover sql-server-ce

如何使用QueryOver<>编写以下SQL语句?语法?

SELECT COUNT(*) FROM (
    SELECT FirstName,LastName 
    FROM People 
    GROUP BY FirstName, LastName
    ) as sub_t

到目前为止,内部查询工作正常:

var q = _session.QueryOver<Person>()
    .SelectList(l => l
        .SelectGroup(x => x.FirstName)
        .SelectGroup(x => x.LastName));

但是我不知道如何将它包装在子查询中并从中获取行数。可以吗?

不幸的是我的RDBMS方言(MsSqlCe40Dialect)不支持COUNT DISTINCT,因此我没有使用SelectCountDistinct()的好处。

3 个答案:

答案 0 :(得分:1)

我不熟悉QueryOver,但是当这个类型的计数无法进行子查询时,我使用了以下聚合函数,认为它可能有用,并且在发布时发现了一些我不知道的问题以前所以我也发布了它们。

注意:对于中等数据量,它大约慢10倍。

汇总方法

SELECT
COUNT(DISTINCT FirstName+LastName )
FROM People

适应特殊情况

类似的组合名称“Joe Smith”vs“Joes Mith” (假设〜不在您的数据集中)

SELECT
COUNT(DISTINCT FirstName+'~'+LastName )
FROM People

空值 (假设^不在您的数据集中)

SELECT
COUNT(DISTINCT IsNull(FirstName,'^')+'~'+IsNull(LastName,'^') )
FROM People

尾随空格,似乎RTRIM是Group By固有的

SELECT
COUNT(DISTINCT IsNull(RTrim(FirstName),'^')+'~'+IsNull(Rtrim(LastName),'^') )
FROM People

<强>基准 (AMD单核四核上的80k行数据)

80-100ms - 运行子查询方法(参见OP)

800-1200ms - 具有明显的聚合方法,适用于特殊情况似乎没有太大的显着差异。

答案 1 :(得分:0)

您是否无法使用IQueryOver的RowCount属性?像这样:

var totalRows = _session.QueryOver<Person>()
.SelectList(l => l
    .SelectGroup(x => x.FirstName)
    .SelectGroup(x => x.LastName)).RowCount();

答案 2 :(得分:0)

好的,我不知道使用QueryOver背后的原因,但我会做这样的事情,我想它会给你你想要的东西:

 Session.CreateCriteria<Person>()
                .SetProjection(
                Projections.ProjectionList()
                    .Add(Projections.GroupProperty("FirstName")))
                    .Add(Projections.GroupProperty("LastName")))
                .List<Person>().Count();

希望有帮助...