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 を使用すると、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
4

1 に答える 1

0

2 番目のコード サンプルを次のように変更できますか (私は F# に詳しくありません)。

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

必要な IQueryable を保持できるようにする必要があります

于 2012-05-01T13:54:04.443 に答える