2012-05-20 73 views
2

我在创建寻呼包装的扩展方法这样的逻辑:RavenDB获得总计数查询不能

 int total = 0; 
     if (query is IRavenQueryable<T>) 
     { 
      RavenQueryStatistics stats; 
      var rQuery = (IRavenQueryable<T>)query; 
      rQuery.Statistics(out stats); 
      total = stats.TotalResults; 
     } 
     else 
     { 
      total = query.Count(); 
     } 

我的问题是,当我做了乌鸦查询,我stats.TotalResults是零,除非我在调试过程中将鼠标悬停在rQuery上并尝试展开结果。

我在这里做错了什么?如何让乌鸦始终如一地给我我需要的结果?

这里是整个方法:

public static PagingModel<T> Page<T>(this IEnumerable<T> query, int page, int count) 
    { 
     if (page < 1) 
      throw new ArgumentOutOfRangeException("Page is one-based and must be greater than zero"); 

     int total = 0; 
     if (query is IRavenQueryable<T>) 
     { 
      RavenQueryStatistics stats; 
      var rQuery = (IRavenQueryable<T>)query; 
      rQuery.Statistics(out stats); 
      total = stats.TotalResults; 
     } 
     else 
     { 
      total = query.Count(); 
     } 

     var results = query 
      .Skip((page - 1) * count) 
      .Take(count) 
      .ToArray(); 

     return new PagingModel<T>() 
     { 
      Page = page, 
      Rows = results, 
      Total = total /count 
     }; 
    } 

回答

4

我想通了自己。事实证明,RavenQueryStatistics通过引用设置TotalResults,总数只有在结果解决后才可用。 (我原本以为它与DB分开旅行)。

public static PagingModel<T> Page<T>(this IEnumerable<T> query, int page, int count) 
    { 
     RavenQueryStatistics stats = null; 
     if (page < 1) 
      throw new ArgumentOutOfRangeException("Page is one-based and must be greater than zero"); 

     if (query is IRavenQueryable<T>) 
     { 
      var rQuery = (IRavenQueryable<T>)query; 
      rQuery.Statistics(out stats); 
     } 

     var results = query 
      .Skip((page - 1) * count) 
      .Take(count) 
      .ToArray(); 
     var total = stats == null ? query.Count() : stats.TotalResults; 
     return new PagingModel<T>() 
     { 
      Page = page, 
      Rows = results, 
      TotalPages = (int)Math.Ceiling((double)total/(double)count) 
     }; 
    }