2011-10-20 13 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)); 

私はそう

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

のように最初の15件の結果を得ることができます。しかし、私はまた、レコードの合計数を取得するために別のクエリを送信する必要がありますが、これまでのところ、私は失敗しましたこれを理解する。予測がまだ適用されている必要があります。つまり、結果が「コスト」の合計で「コード」でグループ化されている場合、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

これはまだ、例えばの数を返すように見えます投影によって返された20行の代わりに100(例えば、 'Code'でグループ化され、 'Cost'の合計で) – Adam

+0

'rowcount.SetProjection(Projections.Count(goupprojections))'がimoを実行する必要があります。 – Firo

+0

それは少なくとも私のためではないように見えます。あなたのアイデアを使用して、CountDistinctを使ってグループ化する単一のプロパティを選ぶことができますが、これは1つのプロパティしか受け付けません – Adam

関連する問題