C# NHibernate-如何在分页结果上使用sum项目
我尝试将分页与求和投影结合使用,以获得我感兴趣的结果页面的列中的值之和。我正在使用.NET、C和NHibernate3.1 我有一个ICriteria,它与关联db表中的所有行相关 然后,我将执行以下操作以获得第一页的版本,即40项中的10项:C# NHibernate-如何在分页结果上使用sum项目,c#,.net,nhibernate,paging,C#,.net,Nhibernate,Paging,我尝试将分页与求和投影结合使用,以获得我感兴趣的结果页面的列中的值之和。我正在使用.NET、C和NHibernate3.1 我有一个ICriteria,它与关联db表中的所有行相关 然后,我将执行以下操作以获得第一页的版本,即40项中的10项: ICriteria recordsCriteria = CriteriaTransformer.Clone(criteria); recordsCriteria.SetFirstResult(0); recordsCriteria.SetMaxResul
ICriteria recordsCriteria = CriteriaTransformer.Clone(criteria);
recordsCriteria.SetFirstResult(0);
recordsCriteria.SetMaxResults(10);
我将此iCiteria用于其他用途,因此我再创建两个克隆:
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();
pageAggCriteria.SetProjection(NHibernate.Criterion.Projections.Sum("ColA"));
vat pageSum = pageAddCriteria.UniqueResult();
totalSum中的值是正确的
为了得到前10个ColA值的总和,我尝试以下方法:
totalAggCriteria.SetProjection(NHibernate.Criterion.Projections.Sum("ColA"));
var totalSum = totalAggCriteria.UniqueResult();
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中是不可能的
换句话说,你想从前10名中选择sumcolA。。。但这个标准会让你从…Thank@dotjoe中选出前十名的sumcolA,我现在正试图用linq解决这个问题。问题是我也在使用泛型,所以在编译时不知道对象的类型。我可以这样做:“List page=pageAggCriteria.List.ToList;”要获得对象列表,我需要执行类似的操作:“page.Sumx=>x…”,但同样,我不知道编译时Tdb的类型,因此无法指定“x.field”进行求和。我知道字段的名称,如果这有帮助的话,但不确定如何使用它…哦,您需要将泛型方法约束到某个接口或类,该接口或类定义了字段,如Where Tbd:IColA。感谢@dotjoe,您应该阅读通用约束,实际上,按照您的建议在客户端执行,然后使用返回对象上的反射对值进行汇总,从而解决了所有问题。正如我所提到的,我知道对象的字段名,因此可以很高兴地这样做