【问题标题】:NHibernate IQueryOver.ToRowCountQuery() equivalent when Using HQL IQuery使用 HQL IQuery 时等效的 NHibernate IQueryOver.ToRowCountQuery()
【发布时间】:2011-10-12 00:14:07
【问题描述】:

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

当使用如下所示的 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()”的等效项,可在通过 IQueryOver 的 IQuery 以提供行数时进行查询。

    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);
    }

【问题讨论】:

    标签: nhibernate hql paging


    【解决方案1】:

    一些疯狂的想法

    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;
    

    【讨论】:

      【解决方案2】:

      我们已经将 HQL 查询转换为 IQueryOver,允许我们利用 ToRowCountQuery() 帮助程序。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多