使用HQL IQuery时的NHibernate IQueryOver.ToRowCountQuery()等效

时间:2011-10-12 00:14:08

标签: nhibernate hql paging

我正在尝试在我的项目中实现分页。

当使用NHibernate的IQueryOver语法时,如下所示,事情按预期工作。

    public PagedResult<T> ExecutePagedQuery(IQueryOver<T,T> query)
    {
        SetPaging(query);

        var results = query.Future<T>();
        var count = query.ToRowCountQuery().FutureValue<int>();

        return new PagedResult<T>()
        {
            TotalItemCount = count.Value,
            PageOfResults = results.ToList()
        };
    }

    protected virtual void SetPaging(IQueryOver<T, T> query)
    {
        var maxResults = PageSize;
        var numberToSkip = (PageNumber - 1) * PageSize;

        query.Skip(numberToSkip).Take(maxResults);
    }

对于某些查询,我们使用的是HQL而不是IQueryOver语法。

我想知道是否有一个等同于“query.ToRowCountQuery()。FutureValue&lt; int&gt;()”可以在传递IQueryOver的IQuery insead时查询以提供行数。

    public PagedResult<T> ExecutePagedQuery(IQuery query)
    {
        SetPaging(query);

        var results = query.Future<T>();
        var count = // ToRowCountQueryEquivalent?

        return new PagedResult<T>()
        {
            TotalItemCount = count,
            PageOfResults = results.ToList()
        };
    }

    protected virtual void SetPaging(IQuery query)
    {
        var maxResults = PageSize;
        var numberToSkip = (PageNumber - 1) * PageSize;

        query.SetFirstResult(numberToSkip);
        query.SetMaxResults(maxResults);
    }

2 个答案:

答案 0 :(得分:0)

一些疯狂的想法

string countQuery;
if (query.QueryString.StartsWith("SELECT", StringComparison.OrdinalIgnoreCase))
    countQuery = Regex.Replace(query.QueryString, "SELECT (.*) FROM", @"SELECT Count($1) FROM", RegexOptions.IgnoreCase);
else
    countQuery = "SELECT COUNT(*) " + query.QueryString;

答案 1 :(得分:0)

我们已经将我们的HQL查询转换为IQueryOver,这使我们可以利用ToRowCountQuery()帮助程序。