F# 正在RavenDB中检索所有结果

F# 正在RavenDB中检索所有结果,f#,ravendb,iqueryable,F#,Ravendb,Iqueryable,我想我可以使用统计功能强制通过多页检索所有结果并跳过 type Linq.IRavenQueryable<'T> with member q.getAll() = let mutable stat = Linq.RavenQueryStatistics() let total = stat.TotalResults let a = q.Statist

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

   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组合来保持字体。 唯一的方法是循环一个固定的高次数,还是设置一个高servepagesize,并占用大量元素

编辑:实际上,即使上面的代码显然也不起作用,要获得有效计数,您需要运行一次查询。必须调用Take0才能触发它

   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

您能将您的第二个代码示例更改为我不熟悉的F:

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

这应该可以让您保留所需的IQueryable

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