获取ravenDB中分页计数的最佳方法

获取ravenDB中分页计数的最佳方法,ravendb,Ravendb,我需要找到raven数据库中的文档数量,这样我就可以正确地分页这些文档。我有以下实现- public int Getcount<T>() { IQueryable<T> queryable = from p in _session.Query<T>().Customize(x =>x.WaitForNonStaleResultsAsOfLastWrite()) select p; return queryable.Count();

我需要找到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()
{
IQueryable queryable=来自_session.Query()中的p。自定义(x=>x.WaitForNonSalesultsAsoflastWrite())
选择p;
返回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;
    }
public int GetCount()
{
//IQueryable queryable=来自_session.Query()中的p。自定义(x=>x.WaitForNonSalesultsAsoflastWrite())
//选择p;
//返回queryable.Count();
拉文奎尔统计数据;
var results=\u session.Query()
.统计数据(统计数据);
返回stats.TotalResults;
}
这总是返回0


我做错了什么?

stats.TotalResults
为0,因为查询从未执行过。请尝试以下方法:

var结果=\u会话
.Query()
.统计数据(统计数据)
.Take(0)
.ToArray();

获取统计数据的奇怪语法也让我大吃一惊。我可以理解为什么需要运行查询来填充statistic对象,但是语法有点冗长

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

扩展方法

public static int QuickCount<T>(this IRavenQueryable<T> results)
{
    RavenQueryStatistics stats;
    results.Statistics(out stats).Take(0).ToArray();
    return stats.TotalResults;
}
publicstaticintquickcount(这是可查询的结果)
{
拉文奎尔统计数据;
results.Statistics(out stats).Take(0.ToArray();
返回stats.TotalResults;
}
单元测试

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

使用只处理单个项目的
Any()
,而不是将处理所有项目的
ToArray()
。无论如何,你对有效载荷不感兴趣。这与Raven API无关,它在LINQ中是一个延迟执行…@JakubKonecki由于
Take(0)
,没有任何项目,因此
ToArray()
只是为了强制服务器往返并获取总计数。响应将不包含任何项目。@ThomasFreudenberg-你说得对,我没有注意到
(0)
;-)。好把戏!