【发布时间】: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