【问题标题】:NHibernate - How do I use a sum project on paged resultsNHibernate - 如何在分页结果上使用 sum 项目
【发布时间】:2011-11-22 17:32:15
【问题描述】:

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


    【解决方案1】:

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

    换句话说,你想要select sum(colA) from (select top 10 ...),但这个条件会给你select top 10 sum(colA) from ...)

    【讨论】:

    • 感谢@dotjoe,我现在正在尝试使用 linq 来解决此问题。问题是我也在使用泛型,所以在编译时不知道对象的类型。我可以这样做:'List page = pageAggCriteria.List().ToList();'要获取对象列表,然后我想做类似的事情:'page.Sum(x => x.....' 但是同样,我在编译时不知道 Tdb 的类型,所以不能指定“x.field”来进行求和。如果有帮助,我知道该字段的名称,但不确定如何使用它...
    • 哦,您需要将 Generic 方法约束到某个接口或类,该接口或类具有像 Where Tbd : IColA 这样定义的字段。您应该阅读通用约束msdn.microsoft.com/en-us/library/d5x73970.aspx
    • 感谢@dotjoe,实际上通过按照您的建议在客户端执行它然后在返回的对象上使用反射来总结值(正如我提到的,我知道对象的字段名称)所以可以很高兴地做到这一点)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2011-04-25
    相关资源
    最近更新 更多