如何使用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()的好处。
答案 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();
希望有帮助...