我尝试将分页与总和投影结合使用,以获取我感兴趣的结果页面的列中值的总和。我正在使用 .NET、C# 和 NHibernate 3.1
我有一个 ICriteria 开始,它与关联数据库表中的所有行相关。
然后,我将执行以下操作以获得包含第一页的版本(例如,40 项中的 10 项):
ICriteria recordsCriteria = CriteriaTransformer.Clone(criteria);
recordsCriteria.SetFirstResult(0);
recordsCriteria.SetMaxResults(10);
我将此 ICriteria 用于其他用途,因此我创建了另外两个克隆:
ICriteria totalAggCriteria = CriteriaTransformer.Clone(criteria);
ICriteria pageAggCriteria = CriteriaTransformer.Clone(recordsCriteria);
如果我看一下这两个新的,第一个有 40 个项目,第二个有 10 个 - 正是我想要的。
假设从数据库返回的对象有一个名为“ColA”的列,它的类型为
Int32
。
由此,我想要所有 40 个 ColA 值的总和以及前 10 个 ColA 值的总和。
要获得所有 40 个 ColA 值的总和,我执行以下操作:
totalAggCriteria.SetProjection(NHibernate.Criterion.Projections.Sum("ColA"));
var totalSum = totalAggCriteria.UniqueResult();
totalSum 中的值是正确的。
为了获得前 10 个 ColA 值的总和,我正在尝试以下操作:
pageAggCriteria.SetProjection(NHibernate.Criterion.Projections.Sum("ColA"));
vat pageSum = pageAddCriteria.UniqueResult();
但是,这给了我与前一个相同的值 - 对于所有 40 个 ColA 值。
我也尝试过以下方法,但结果相同:
pageAggCriteria.SetProjection(NHibernate.Criterion.Projections.Sum(column));
pageAggCriteria.SetFirstResult(firstResult.Value);
pageAggCriteria.SetMaxResults(pageSize.Value);
pageSum = pageAggCriteria.UniqueResult();
还有:
pageAggCriteria.SetFirstResult(firstResult.Value);
pageAggCriteria.SetMaxResults(pageSize.Value);
pageAggCriteria.SetProjection(NHibernate.Criterion.Projections.Sum(column));
pageSum = pageAggCriteria.UniqueResult();
任何人都可以告诉我哪里出了问题,以及如何真正获得前 10 个结果中的 ColA 值的总和?
谢谢
可能最容易在客户端完成此操作。聚合函数是对整个表进行操作的。您想要做的是针对分页结果运行聚合函数,我认为这对于 NH 是不可能的。
换句话说,你想要
select sum(colA) from (select top 10 ...)
但这个标准会给你 select top 10 sum(colA) from ...)