NHibernate:获取任意条件查询返回的行数的通用方法
我知道CriteriaTransformer.TransformToRowCount,但根据我的经验,它不适用于聚合函数,它们经常使用。因为我正在为我的应用程序编写一种分页框架,所以为每个数据查询编写计数查询将非常繁琐。 你知道如何优化吗 这是一个例子。它是oracle sql,易于操作。本质上 不要浪费时间去计算没人会看到的东西。 只需显示下一个和上一个链接。选择比显示的多1个,以确定是否应隐藏“下一步”按钮 如果需要最后一个按钮,请在sql中按倒序。 作为比较: 调整谷歌的搜索url以获得第101页,他们会告诉你:对不起,谷歌不会为任何查询提供超过1000个结果。您要求从1001开始计算结果。 这并不难:NHibernate:获取任意条件查询返回的行数的通用方法,nhibernate,Nhibernate,我知道CriteriaTransformer.TransformToRowCount,但根据我的经验,它不适用于聚合函数,它们经常使用。因为我正在为我的应用程序编写一种分页框架,所以为每个数据查询编写计数查询将非常繁琐。 你知道如何优化吗 这是一个例子。它是oracle sql,易于操作。本质上 不要浪费时间去计算没人会看到的东西。 只需显示下一个和上一个链接。选择比显示的多1个,以确定是否应隐藏“下一步”按钮 如果需要最后一个按钮,请在sql中按倒序。 作为比较: 调整谷歌的搜索url以获得第
private IPagedList<ProjT> FindPaged<ProjT>(DetachedCriteria criteria, int pageIndex, int pageSize, IResultTransformer resultTransformer)
{
int firstResult = pageIndex == 1 ? 0 : (pageIndex - 1) * pageSize;
var countCriteria = CriteriaTransformer
.Clone(criteria)
.SetProjection(Projections.RowCount());
countCriteria.ClearOrders();
IMultiCriteria multiCriteria = Session.CreateMultiCriteria();
multiCriteria.Add(countCriteria);
criteria.SetFirstResult(firstResult).SetMaxResults(pageSize);
if (resultTransformer != null)
{
criteria.SetResultTransformer(resultTransformer);
}
multiCriteria.Add(criteria);
var result = multiCriteria
.List()
.Cast<System.Collections.ArrayList>()
.ToList();
PagedList<ProjT> list = new PagedList<ProjT>(
result[1].Cast<ProjT>().ToList<ProjT>(),
pageIndex,
pageSize,
(int)result[0][0]);
return list;
}
其中IPagedList是:
public interface IPagedList<T> : ICollection<T>
{
int TotalPages { get; }
int TotalCount { get; }
int PageIndex { get; }
int PageSize { get; }
bool HasPreviousPage { get; }
bool HasNextPage { get; }
bool IsFirstPage { get; }
bool IsLastPage { get; }
}
和执行:
public class PagedList<T> : List<T>, IPagedList<T>
{
public PagedList(IEnumerable<T> source, int pageIndex, int pageSize) :
this(source, pageIndex, pageSize, source.Count())
{ }
public PagedList(IEnumerable<T> source, int pageIndex, int pageSize, int totalCount)
{
this.TotalCount = totalCount;
this.PageSize = pageSize;
this.PageIndex = pageIndex;
double pc = this.TotalCount / this.PageSize;
if (this.TotalCount % this.PageSize > 0)
{
pc++;
}
this.TotalPages = (int)pc;
this.HasPreviousPage = (PageIndex > 1);
this.HasNextPage = (PageIndex * PageSize) < TotalCount;
this.IsFirstPage = (this.PageIndex == 1);
this.IsLastPage = (this.PageIndex == this.TotalPages);
this.AddRange(source);
}
public int TotalPages { get; private set; }
public int TotalCount { get; private set; }
public int PageIndex { get; private set; }
public int PageSize { get; private set; }
public bool HasPreviousPage { get; private set; }
public bool HasNextPage { get; private set; }
public bool IsFirstPage { get; private set; }
public bool IsLastPage { get; private set; }
}
我所说的优化是指减少用于计算查询行数的代码行数,并使此代码尽可能通用地用于任何查询good response,基本上与我所建议的相同,但您的答案远没有那么懒惰…+1