【问题标题】:retrieving all results in RavenDB检索 RavenDB 中的所有结果
【发布时间】:2012-05-01 13:24:51
【问题描述】:

我以为我可以使用统计功能强制通过多个页面检索所有结果并跳过

   type Linq.IRavenQueryable<'T>
    with member q.getAll() =  let mutable stat = Linq.RavenQueryStatistics()
                              let total = stat.TotalResults
                              let a = q.Statistics(&stat)
                              let rec addone n = seq { yield  q.Skip(n*1024).Take(1024).ToArray()
                                                       if n*1024 < total  then
                                                         yield! addone  (n + 1) }
                              addone 0 |> Array.concat

当你这样做时它会起作用

 let q =  session.Query<productypfield>()
 let r = q.getAll()

但与

中断
 let q =  session.Query<productypfield>().Where(System.Func ....)
 let r = q.getAll()

由于 Linq.IRavenQueryable 类型通过 Linq 组合不是幂等的:如果我使用 Linq,我会得到一个没有定义 q.Statistics(&stat) 的 IEnumerable。

我阅读了文档,但无论如何我都没有看到通过 Linq 组合来保持类型。 是循环固定(高)次数或设置高服务页面大小并获取(大量元素)的唯一方法吗?

edit :实际上,即使上面的代码显然也不能正常工作,要获得有效计数,您需要运行一次查询。必须调用 Take(0) 来触发它。

   use session = store.OpenSession()
   let q =  session.Query<productypfield>()
   let mutable s = Linq.RavenQueryStatistics()
   let a = q.Statistics(&s)  
   s.TotalResults = 0 //true
   printfn "%A" a      //triggers evaluation
   s.TotalResults = 0 //false

【问题讨论】:

  • 显然我可以在服务器上定义一个索引,通过它进行查询,然后使用我的扩展方法,但我觉得我在这里遗漏了一些东西
  • 小心。 “默认安全”的一部分包括每个文档会话的最大查询数。我认为它默认设置为 30。
  • 是的,我看到了那部分。这不是问题,因为当我写的时候,我知道我写了多少,并相应地刷新。

标签: f# ravendb iqueryable


【解决方案1】:

你能把你的第二个代码示例改成这个吗(我不熟悉 F#):

let q =  session.Query<productypfield>().Where(Expression<System.Func<....>>)
let r = q.getAll()

这应该让您保留所需的 IQueryable

【讨论】:

  • 但我猜 IRavenQueryable 属性 .Statistics(&stat) 仍然不可用?
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多