Two solutions available for paging fetch result:
- SetFirstResult/SetMaxResult when using NHibernate detached queies. Ayende has a good example.
- Skip()/Take() when using NHibernate.Linq
I personally like the latter because it’s strongly typed. Performance are same, both with TOP(N) in the generated SQL.
Only issue remaining, how to pass the total count back to service/UI? Options
- Using out parameter keyword, as this example.
- Create my own Page<T> class to organize the fetch result, similar to the Pager class in Karl’s ModelQuery
Code: (This one has a double query problem)
public Page<Organization> FetchOrganizationWithNameContains(string orgNamePart
, int indexOfPage, int resultsPerPage)
{
var result = new Page<Organization>();
var query = Session.Linq<Organization>().Where(x => x.Name.Contains(orgNamePart));
result.Entities = query.Skip((indexOfPage - 1)*resultsPerPage)
.Take(resultsPerPage).ToArray();
result.TotalCount = query.Count();
return result;
}