2011-11-22 50 views
1

我想使用分頁結合總和投影得到一個列中的值的總和只是我感興趣的結果頁面。我使用.NET,C#和NHibernate的3.1NHibernate的 - 我如何使用分頁結果的總結項目

我有一個ICriteria開始與哪些相關的數據庫表中的所有行。

我然後做下面的得到的第一頁版本(比如,10項總分40):

ICriteria recordsCriteria = CriteriaTransformer.Clone(criteria); 
recordsCriteria.SetFirstResult(0); 
recordsCriteria.SetMaxResults(10); 

我使用這個的ICriteria別的東西,所以我創建兩個進一步克隆:

ICriteria totalAggCriteria = CriteriaTransformer.Clone(criteria); 
ICriteria pageAggCriteria = CriteriaTransformer.Clone(recordsCriteria); 

如果我來看看這兩款新先在有40個項目,第二個有10內部 - 正是我想要的。

假設從DB返回的對象有一個名爲「ColA」的列,它的類型爲Int32

由此,我想要得到所有40個ColA值的總和和前10個ColA值的總和。

要獲得所有40個可樂值的總和,我做了以下內容:

totalAggCriteria.SetProjection(NHibernate.Criterion.Projections.Sum("ColA")); 
var totalSum = totalAggCriteria.UniqueResult(); 

在totalSum值是正確的。

爲了得到第10個可樂值的總和,我想以下幾點:

pageAggCriteria.SetProjection(NHibernate.Criterion.Projections.Sum("ColA")); 
vat pageSum = pageAddCriteria.UniqueResult(); 

然而,這給了我同樣的值與前一個 - 爲所有40個可樂值。

我也試過以下,但它給出了相同的結果:

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值的總和嗎?

謝謝

回答

0

可能最容易做到這一點的客戶端。聚合函數在整個表上運行。你試圖做的是運行聚合函數對頁面結果,我認爲不可能與NH。

換句話說,你要select sum(colA) from (select top 10 ...)但這個標準會給你select top 10 sum(colA) from ...)

+0

感謝@dotjoe,我現在試圖找出如何使用LINQ做。問題是我正在使用泛型,所以在編譯時不知道對象的類型。 我能做的: '列表 page = pageAggCriteria.List ().ToList();' 得到的對象列表 然後我會想要做這樣的: 'page.Sum(x => x .....' 但是,我不知道編譯時的Tdb類型所以不能指定'x.field'來進行求和。我知道該字段的名稱,如果有幫助,但不知道如何使用這個... – trembler2003

+0

哦,你需要將通用方法限制在某個接口或類中,該接口或類的字段的定義類似於:Where Tbd:IColA '。你應該閱讀泛型約束http://msdn.microsoft.com/en-us/library/d5x73970.aspx – dotjoe

+0

感謝@dotjoe,實際上解決了這一切,通過做你的建議客戶端,然後在返回使用反射對象來總結這些值(正如我所提到的,我知道對象的字段名稱可以愉快地做到這一點) – trembler2003