Итоговые результаты постраничного прогнозируемого запроса nhibernate с агрегатами - PullRequest
2 голосов
/ 20 октября 2011

Я динамически создаю проектируемый запрос 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, которые меня интересуют.

Как я могу получить общее количество записей, которые будут возвращены? Спасибо

1 Ответ

0 голосов
/ 20 октября 2011

возможно это:

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>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...