2011-10-12 47 views
0

我试图在我的项目中实现分页。NHibernate IQueryOver.ToRowCountQuery()相当于使用HQL时IQuery

当使用如下所示的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 < int>()”,可以在查询传递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); 
    } 

回答

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; 
0

我们,因为我们转换HQL查询IQueryOver使我们能够采取ToRowCountQuery()辅助的优势。

+0

这是越野车。 http://stackoverflow.com/questions/8012966/torowcountquery-seems-to-ignore-groupings –