NHibernate - 如何在分页结果上使用求和项目

问题描述 投票:0回答:1

我尝试将分页与总和投影结合使用,以获取我感兴趣的结果页面的列中值的总和。我正在使用 .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 值的总和?

谢谢

c# .net pagination nhibernate
1个回答
0
投票

可能最容易在客户端完成此操作。聚合函数是对整个表进行操作的。您想要做的是针对分页结果运行聚合函数,我认为这对于 NH 是不可能的。

换句话说,你想要

select sum(colA) from (select top 10 ...)
但这个标准会给你
select top 10 sum(colA) from ...)

© www.soinside.com 2019 - 2024. All rights reserved.