2011-10-20 64 views
2

我正在动态构建一个需要实现分页的nhibernate投影查询。喜欢的东西...集合分页投影nhibernate查询的总计结果

var projections = Projections.ProjectionList(); 
foreach (var p in projection.Projections) 
{ 
    IProjection newProjection = null; 
    switch (p.AggregateFunc) 
    { 
     case AggregateFuncTypeEnum.GroupProperty: 
      newProjection = Projections.GroupProperty(p.Path); 
      break; 
     case AggregateFuncTypeEnum.Sum: 
      newProjection = Projections.Sum(p.Path); 
      break; 
     default: 
      newProjection = Projections.Property(p.Path); 
      break; 
    } 
    projections.Add(newProjection, p.Name); 
} 
criteria.SetProjection(projections).SetResultTransformer(new AliasToBeanResultTransformer(projectionType)); 

我能得到前15分的结果,像这样

criteria.SetFirstResult(0); 
criteria.SetMaxResults(15); 
var results = criteria.List(); 

但我也需要发送另一个查询来获取的记录总数,但到目前为止,我已经失败弄清楚这一点。该投影仍然需要应用,即如果结果按'代码'分组并且'成本'之和那么100条记录可能返回20行,并且这是我感兴趣的20条。

我该如何获得将返回的记录总数?由于

回答

0

也许这:

var rowcount = CriteriaTransformer.Clone(criteria); 

var goupprojections = Projections.ProjectionList(); 
var projections = Projections.ProjectionList(); 
foreach (var p in projection.Projections) 
{ 
    IProjection newProjection = null; 
    switch (p.AggregateFunc) 
    { 
     case AggregateFuncTypeEnum.GroupProperty: 
      newProjection = Projections.GroupProperty(p.Path); 
      goupprojections.Add(Projections.GroupProperty(p.Path), p.Name); 
      break; 
     case AggregateFuncTypeEnum.Sum: 
      newProjection = Projections.Sum(p.Path); 
      break; 
     default: 
      newProjection = Projections.Property(p.Path); 
      break; 
    } 
    projections.Add(newProjection, p.Name); 
} 
criteria.SetProjection(projections).SetResultTransformer(new AliasToBeanResultTransformer(projectionType)); 

if (goupprojections.Aliases.Length == 0) 
{ 
    rowcount.SetProjection(Projections.RowCount()) 
} 
else 
{ 
    rowcount.SetProjection(Projections.Count(goupprojections)) 
} 

var results = criteria.Future(); 
var count = rowcount.FutureValue<int>(); 
+0

这似乎仍然返回例如计数100而不是由投影返回的20行(例如,按'代码'分组并且总和为'成本') – Adam

+0

'rowcount.SetProjection(Projections.Count(goupprojections))'应该做imo,我会检查至少在 – Firo

+0

看起来应该但不适合我。使用你的想法,我可以选择一个属性来使用CountDistinct进行分组,但这只接受一个属性 – Adam