c# - NHibernate QueryOver<> - 通过 SubQuery 聚合函数

标签 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()。

最佳答案

我不熟悉 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/

相关文章:

python - INSERT INTO SELECT 语法错误 Python ODBC 与 Microsoft Access

c# - NHibernate映射问题

c# - WinForms 表单卡住

c# - 如何从 UWP TimePicker 中删除按钮

c# - 使用 JSON 字符串将多个值添加到 1 个用户声明中

SQL Server 2014 插入不在其中的位置

c# - 无法从 C# 中的字符串中删除 CRLF

SQL |加入使用vs加入

c# - 使用 SQLite :memory: with NHibernate 时出现问题

c# - 如何在多线程控制台应用程序中使用 Sharp Architecture 设置 NHibernate?