NHibernate - Как использовать проект суммы на постраничных результатах - PullRequest
1 голос
/ 22 ноября 2011

Я пытаюсь использовать подкачку в сочетании с проекцией суммы, чтобы получить сумму значений в столбце только для той страницы результатов, которая мне интересна. Я использую .NET, C # и NHibernate 3.1

У меня есть ICriteria для начала, который связан со всеми строками из связанной таблицы БД.

Затем я делаю следующее, чтобы получить версию с первой страницей (скажем, 10 элементов).из 40):

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

Я использую эту Критерию для чего-то другого, поэтому создаю еще два клона:

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();

Значение в totalSum верное.

Чтобы получить суммупервые 10 значений ColA, я пробую следующее:

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();

Может кто-нибудь дать представление о том, где я иду не так и как я могу на самом деле получитьсумма значений ColA в первых 10 результатах?

Спасибо

1 Ответ

0 голосов
/ 22 ноября 2011

Вероятно, проще всего сделать эту сумму на стороне клиента. Агрегатная функция работает на всю таблицу. То, что вы пытаетесь сделать, - запустить агрегатную функцию для постраничного результата, что я не думаю, что это возможно с NH.

Другими словами, вы хотите select sum(colA) from (select top 10 ...), но этот критерий даст вам select top 10 sum(colA) from ...)

...