如何使用Session.Query <t>进行NHibernate分页,只需调用一次数据库?</t>

时间:2013-03-27 15:22:48

标签: nhibernate paging linq-to-nhibernate

我已经使用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)

通过Google搜索,我遇到了thisthis

所以我决定使用Session.Query而不是Session.QueryOver,以便我可以使用条件表达式而不受任何限制。

现在我的问题是如何通过一次调用数据库来获取行数以及分页数据?有没有其他人使用Session.Query进行分页,如果是的话是什么方法;我们可以使用对TotalRowsCount和PagedData的数据库的单次调用来实现它吗?

0 个答案:

没有答案