2012-05-01 3 views
1

Я думал, что я мог заставить, чтобы получить все результаты через многократные страницы и пропустить, с помощью функции статистикиполучение всех результатов в RavenDB

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 (& 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

, очевидно, я мог бы определить индекс на сервере, запрос через него и просто использовать мои методы расширения, но я чувствую, что здесь что-то не хватает – nicolas

+0

Будьте осторожны. Часть «Безопасный по умолчанию» включает в себя максимальное количество запросов на сеанс документа. Я думаю, что по умолчанию установлено значение 30. –

+0

да я видел эту часть. это не проблема, поскольку, когда я пишу, я знаю, сколько я пишу, и флеш соответственно. – nicolas

ответ

0

Можете ли вы изменить свой 2-й образец кода для этого (я не знаком с F #):

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

, который должен позволить вам сохранить IQueryable, что вам нужно

+0

, но свойство IRavenQueryable .Statistics (& stat) все равно не будет доступно. Думаю? – nicolas

Смежные вопросы