統計機能を使用して、複数のページを介してすべての結果を強制的に取得してスキップできると思いました
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 コンポジションで型を保持する方法がわかりません。一定の (高い) 回数をループする、または高い servepagesize を設定して (多くの要素) を取得する唯一の方法はありますか?
編集: 実際には、上記のコードでさえ明らかに機能しません。有効なカウントを取得するには、クエリを 1 回実行する必要があります。それをトリガーするには、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