Piszę kryteria NHibernate, które wybiera dane obsługujące stronicowanie. Używam wyrażenie COUNT(*) OVER()
z SQL Server 2005 (+), aby uzyskać całkowitą liczbę dostępnych wierszy, jako suggested przez Ayende Rahien. Potrzebuję tej liczby, aby móc obliczyć, ile stron jest w sumie. Piękno tego rozwiązania polega na tym, że nie muszę wykonywać drugiego zapytania, aby uzyskać liczbę wierszy.Dodawanie projekcji do kryteriów NHibernate powoduje, że nie wykonuje on domyślnego wyboru jednostek.
Jednak nie wydaje mi się, aby udało się napisać działające kryteria (Ayende zapewnia tylko kwerendę HQL).
Oto zapytanie SQL, które pokazuje, co chcę i działa dobrze. Zauważ, że celowo pominięte rzeczywistą logiki stronicowania skupić się na problemie:
SELECT Items.*, COUNT(*) OVER() AS rowcount
FROM Items
oto HQL:
select
item, rowcount()
from
Item item
pamiętać, że funkcja rowcount()
jest zarejestrowany w niestandardowych NHibernate dialektu i postanawia COUNT(*) OVER()
w SQL.
Warunek jest taki, że zapytanie jest wyrażane za pomocą kryteriów. Niestety, nie wiem jak zrobić to dobrze:
var query = Session
.CreateCriteria<Item>("item")
.SetProjection(
Projections.SqlFunction("rowcount", NHibernateUtil.Int32));
Ilekroć dodać projekcję, NHibernate nie wybiera item
(jak to będzie bez projekcji), tylko rowcount()
a ja naprawdę potrzebuję obu. Ponadto, nie mogę zaprojektować całości jako całości, tylko jej właściwości i naprawdę nie chcę ich wszystkich wymienić.
Mam nadzieję, że ktoś ma rozwiązanie tego problemu. Dzięki i tak.
Korzystanie CreateMultiCriteria skutkowałoby dwóch oddzielnych zapytań SQL, które będą generowane. Chociaż będą one wykonywane w jednej partii, nadal nie będą tak wydajne, jak wykonywanie tylko jednego zapytania. Chcę "SELECT *, COUNT (*) OVER() AS rowcount FROM Items", a nie "SELECT * FROM Items; WYBIERZ LICZBĘ (*) JAKO liczba wierszy z elementów, jak przyszedłby scenariusz CreateMultiCriteria. –