1

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

   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
4

1 回答 1

0

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

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

那应该让您保留所需的 IQueryable

于 2012-05-01T13:54:04.443 回答