RavenDB“全选”的最佳实践?

时间:2012-03-30 07:10:11

标签: linq select ravendb

我有一个关于如何在RavenDB上实现“select * from xxx where ...”的相同行为的问题,因为会返回大量文档(已设置索引)。

我听说默认行为是Take(128),对吧?但我想要的是像TakeAll(),因为我不知道实际的数字。如何正确实现?

我能想到的是使用Skip()和Take()直到结束。但这对于这样一个简单的要求来说看起来真的很乏味。此外,它可能超过单个会话的请求数量限制,这是我想知道如何优雅克服的另一个障碍。

非常感谢:)

2 个答案:

答案 0 :(得分:5)

多德,其原因在于,无论你想做什么,一次加载所有内容都是总是不良做法。但是,默认情况下,您可以使用.Take(1024)一次获取1024。如果确实想要增加此限制,您可以在服务器配置中更改“Raven / MaxPageSize”,默认为1024,但是再次 - 您几乎不想这样做。

答案 1 :(得分:1)

Dodd,虽然我同意@Daniel认为选择所有不是最佳做法,但你仍然可以拥有一个很好的用例。

修改

此技术无效,因为MaxPageSize仍然是上限(正如@Ayende在下面的评论中所述。

您可以执行两个简单的查询来获取数据,而不是在循环迭代中设置MaxPageSize或调用Take()

第一个查询将用于确定 HOW MANY 记录的存在。请注意Take(0)不会返回任何结果,但会填充统计信息

RavenQueryStatistics stats = null;
var tempPagingQuery = (from p in session.Query<Page>
                        .Statistics(out stats)
                       select p).Take(0).FirstOrDefault();

第二个查询将获取所有记录。在这里,我们使用上面收集的 statistics 中的TotalResults

pages = (from p in session.Query<Page>
         select p).Take(stats.TotalResults).ToList();

<击>