Я пишу критерий NHibernate, который выбирает данные, поддерживающие подкачку. Я использую выражение COUNT(*) OVER()
из SQL Server 2005 (+), чтобы получить общее количество доступных строк, как предложено Айенде Рахьеном . Мне нужно это число, чтобы подсчитать, сколько всего страниц. Прелесть этого решения в том, что мне не нужно выполнять второй запрос, чтобы получить счетчик строк.
Однако мне не удается написать рабочий критерий (Ayende предоставляет только HQL-запрос).
Вот SQL-запрос, который показывает, что я хочу, и он работает просто отлично. Обратите внимание, что я намеренно пропустил фактическую логику подкачки, чтобы сосредоточиться на проблеме:
SELECT Items.*, COUNT(*) OVER() AS rowcount
FROM Items
Вот HQL:
select
item, rowcount()
from
Item item
Обратите внимание, что функция rowcount()
зарегистрирована на пользовательском диалекте NHibernate и преобразуется в COUNT(*) OVER()
в SQL.
Требование заключается в том, чтобы запрос выражался с использованием критериев. К сожалению, я не знаю, как сделать это правильно:
var query = Session
.CreateCriteria<Item>("item")
.SetProjection(
Projections.SqlFunction("rowcount", NHibernateUtil.Int32));
Всякий раз, когда я добавляю проекцию, NHibernate не выбирает item
(как это было бы без проекции), просто rowcount()
, в то время как мне действительно нужны оба. Кроме того, я не могу проецировать item
в целом, только его свойства, и я действительно не хочу перечислять их все.
Надеюсь, у кого-то есть решение для этого. В любом случае, спасибо.