Этот запрос работал у меня до недавнего времени. Теперь у меня в RavenDB 135 документов InstallationSummary. Вместо того, чтобы получать самые свежие документы по времени начала, он в основном работает, но последняя пара, самые последние документы не отображаются из этого запроса. Я неправильно запрашиваю? Есть ли другой способ сделать OrderByDescending и Take с RavenDB, о котором я должен знать? Есть ли ограничение на количество документов, которое я могу правильно запросить?
Примечание. Я отладил это, и запрос действительно возвращает то, что мы видим в сетке. Между моментом выполнения запроса и тем, что отображается в пользовательском интерфейсе, не выполняется никаких преобразований.
IEnumerable<InstallationSummary> installationSummaries =
QueryAndCacheEtags(session => session.Advanced.LuceneQuery<InstallationSummary>()
.Include(x => x.ApplicationServerId)
.Include(x => x.ApplicationWithOverrideVariableGroup.ApplicationId)
.Include(x => x.ApplicationWithOverrideVariableGroup.CustomVariableGroupId)
.OrderByDescending(summary => summary.InstallationStart)
.Take(numberToRetrieve)).Cast<InstallationSummary>().ToList();
В этой сетке должно появиться еще несколько строк со временем начала больше, чем 19.01.2012 18:33:51:
Изменить: я удалил Take (numberToRetrieve) из запроса, и я получаю только 128 из 160 документов InstallationSummary. Я вижу все 160 в RavenDB Studio, но только 128 возвращается из запроса. 128 ... 128 ... степень двойки ... Я достиг какого-то предела?
Ладно, похоже, я достиг предела в 128: http://www.blogcoward.com/archive/2010/05/21/RavenDB-and-a-brief-design-philosophy-discussion-with-Ayende.aspx http://codeofrob.com/archive/2010/05/12/ravendb-basic-usage-considerations.aspx
Но почему? У меня там есть метод Take (). Как мне получить 50 самых свежих документов?
В качестве небольшого взлома приведенный ниже запрос покажет, по крайней мере, самый последний. Это не совсем то, что я хочу, потому что мне нужны самые последние 50, независимо от даты. Если с даты начала осталось не более 50, по крайней мере будут отображаться самые последние элементы.
using Raven.Client.Linq;
DateTime startDate = new DateTime(2012, 1, 18);
IEnumerable<InstallationSummary> installationSummaries =
QueryAndCacheEtags(session => session.Query<InstallationSummary>()
.Include(x => x.ApplicationServerId)
.Include(x => x.ApplicationWithOverrideVariableGroup.ApplicationId)
.Include(x => x.ApplicationWithOverrideVariableGroup.CustomVariableGroupId)
.Where(x => x.InstallationStart > startDate)
.OrderByDescending(summary => summary.InstallationStart)
.Take(numberToRetrieve)
).Cast<InstallationSummary>().ToList();
Мне пришлось перейти от LuceneQuery к просто Query, и мне пришлось добавить предложение Where.
session.Query<InstallationSummary>()
. Все остальное делается в памяти после того, как было извлечено 128 документов (без применения упорядочения или фильтрации). - person Matt Warren   schedule 27.01.2012IQueryable<EntityBase> QueryAndCacheEtags(Expression<Func<IDocumentSession, IEnumerable<EntityBase>>> expFunc)
, и это должно позволить RavenDB использовать предложение Where и части запроса OrderbyDescending. - person Matt Warren   schedule 27.01.2012QueryAndCacheEtags(..)
и наведете указатель мыши на остальную часть вызова функции, Intellisense покажет вам разницу. Все, что не является IQueryable ‹T›, RavenDB не выполняет на сервере. - person Matt Warren   schedule 29.01.2012IQueryable
решил проблему в вашем случае. В любом случае, рад, что у вас это работает - person Matt Warren   schedule 29.01.2012