【问题标题】:Best way to get Count for paging in ravenDB在 ravenDB 中获取分页计数的最佳方法
【发布时间】:2011-08-17 13:05:44
【问题描述】:

我需要找出 raven 数据库中的文档数量,以便可以正确地将文档分页。我有以下实现-

public int Getcount<T>()
{
    IQueryable<T> queryable = from p in _session.Query<T>().Customize(x =>x.WaitForNonStaleResultsAsOfLastWrite())
    select p;
    return queryable.Count();
}

但如果计数太大,则会超时。

我尝试了常见问题解答中建议的方法-

    public int GetCount<T>()
    {
        //IQueryable<T> queryable = from p in _session.Query<T>().Customize(x => x.WaitForNonStaleResultsAsOfLastWrite())
        //                          select p;
        //return queryable.Count();

        RavenQueryStatistics stats;
        var results = _session.Query<T>()
            .Statistics(out stats);

        return stats.TotalResults;
    }

这总是返回 0。

我做错了什么?

【问题讨论】:

    标签: ravendb


    【解决方案1】:

    stats.TotalResults 为 0,因为从未执行过查询。试试这个:

    var results = _session
        .Query<T>()
        .Statistics(out stats)
        .Take(0)
        .ToArray();
    

    【讨论】:

    • 而不是ToArray(),它将处理所有项目,使用Any(),它将仅处理单个项目。无论如何,您对有效载荷不感兴趣。这与 Raven API 无关,它是 LINQ 中的延迟执行...
    • @JakubKonecki 因为Take(0),所以没有任何项目,所以ToArray() 只是为了强制服务器往返并获取总数。响应将不包含任何项目。
    • @ThomasFreudenberg - 你说得对,我没有注意到(0) ;-)。好技巧!
    【解决方案2】:

    获取统计信息的奇怪语法也让我感到困惑。我可以看到为什么需要运行查询才能填充统计对象,但语法有点冗长。

    我编写了以下扩展方法用于我的单元测试。它有助于保持代码简洁。

    扩展方法

    public static int QuickCount<T>(this IRavenQueryable<T> results)
    {
        RavenQueryStatistics stats;
        results.Statistics(out stats).Take(0).ToArray();
        return stats.TotalResults;
    }
    

    单元测试

    ...
    db.Query<T>().QuickCount().ShouldBeGreaterThan(128);
    ...
    

    【讨论】:

      猜你喜欢
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多