我以为我可以使用统计功能强制通过多个页面检索所有结果并跳过
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,我会得到一个 IEnumerable,在该 IEnumerable 上没有定义 q.Statistics(&stat)。
我阅读了文档,但无论如何我都看不到通过 Linq 组合来保持类型。是循环固定(高)次数或设置高服务页面大小并采用(大量元素)的唯一方法吗?
编辑:实际上,即使上面的代码显然也不能正常工作,要获得有效计数,您需要运行一次查询。必须调用 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