我已经使用Session.QueryOver在NHibernate中实现了分页,如下所示:
public PagedList<T> GetPaged(Expression<Func<T, bool>> expression, PagingInfo pagingInfo)
{
ISession session = sessionManager.OpenSession().InnerSession;
try
{
int pageIndex = pagingInfo.PageIndex < 1 ? 1 : pagingInfo.PageIndex;
var rowCount = session.QueryOver<T>().Where(expression)
.Select(Projections.RowCount())
.FutureValue<int>();
var query = session.QueryOver<T>().TransformUsing(Transformers.DistinctRootEntity)
.Where(expression);
query = OrderBy(query, pagingInfo.OrderBy, pagingInfo.OrderDirection);
var results = query.Take(pagingInfo.PageSize)
.Skip((pageIndex - 1) * pagingInfo.PageSize)
.Future<T>();
return new PagedList<T>(results, pageIndex, pagingInfo.PageSize, rowCount.Value);
}
finally
{
sessionManager.CloseSession();
}
}
private static IQueryOver<T, T> OrderBy(IQueryOver<T, T> query, string orderBy, OrderDirection orderDirection)
{
Order order = orderDirection == OrderDirection.Asc ? Order.Asc(orderBy) : Order.Desc(orderBy);
query.UnderlyingCriteria.AddOrder(order);
return query;
}
上面的分页代码工作正常,除非我使用这样的表达式:
Expression<Func<User, bool>> expression = usr => (string.IsNullOrEmpty(name) || usr.Name.Contains(name))
&& (string.IsNullOrEmpty(loginName) || usr.LoginName.Contains(loginName))
&& (string.IsNullOrEmpty(code) || usr.Code.Contains(code));
并用于获取分页列表:
var users = _userRepo.GetPaged(expression, pagingInfo);
以上对GetPaged的调用引发了以下异常:
NHibernate Unrecognised method call: System.String:Boolean IsNullOrEmpty(System.String)
所以我决定使用Session.Query而不是Session.QueryOver,以便我可以使用条件表达式而不受任何限制。
现在我的问题是如何通过一次调用数据库来获取行数以及分页数据?有没有其他人使用Session.Query进行分页,如果是的话是什么方法;我们可以使用对TotalRowsCount和PagedData的数据库的单次调用来实现它吗?