检索RavenDB中的所有结果

时间:2012-05-01 13:24:51

标签: f# ravendb iqueryable

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

跳过
   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

1 个答案:

答案 0 :(得分:0)

您可以将第二个代码示例更改为此(我不熟悉F#):

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

应该让你保持你需要的IQueryable