如何使用 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()。
最佳答案
我不熟悉 QueryOver,但当子查询无法用于此类计数时,我使用了以下聚合函数,认为它可能有用,并且在发帖时发现了一些我没有意识到的问题以前所以我也发布了它们。
注意:中等数据量时速度大约慢 10 倍。
聚合法
SELECT
COUNT(DISTINCT FirstName+LastName )
FROM People
适应特殊情况
相似的组合名称“Joe Smith”与“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-1200 毫秒 - 不同的聚合方法,适应特殊情况似乎没有太大的区别。
关于c# - NHibernate QueryOver<> - 通过 SubQuery 聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6931292/