我以为我可以强制通过多个页面检索所有结果并使用统计函数
跳过 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,其上没有定义q.Statistics(&amp; 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
答案 0 :(得分:0)
您可以将第二个代码示例更改为此(我不熟悉F#):
let q = session.Query<productypfield>().Where(Expression<System.Func<....>>)
let r = q.getAll()
应该让你保持你需要的IQueryable