Ravendb запрос правильные результаты после второй попытки
-
25-10-2019 - |
Вопрос
Когда начинается мой C#, WPF -интерфейс начинается, одна из вкладок вызывает этот код при загрузке. Самые последние отображаемые данные-11-фебл-2012, хотя существуют документы по инсталляциям-сад для 15-Feb-2012. Когда я нажимаю кнопку обновления, этот тот же код вызывается, только на этот раз отображаются самые последние результаты. Как один и тот же код может дать два разных результата?
IQueryable<EntityBase> installationSummaries =
QueryAndSetEtags(session => session.Query<InstallationSummary>()
.Include(x => x.ApplicationServerId)
.Include(x => x.ApplicationWithOverrideVariableGroup.ApplicationId)
.Include(x => x.ApplicationWithOverrideVariableGroup.CustomVariableGroupId)
.OrderByDescending(summary => summary.InstallationStart)
.Take(numberToRetrieve));
Примечание: у меня такая же проблема с другим запросом. Кажется, что я давно не запрашивал, я получаю неверные результаты. Если я запрошу снова сразу после того, как я просто сделал это, я получаю правильные результаты. Мне интересно, нужно ли мне создать индекс. Существует более 10 000 документов по установке, и производительность в порядке. Это точность, с которой у меня проблемы.
Решение
Похоже на устаревшем индексе. Попробуйте добавить эту строку и посмотреть, поможет ли это
.Customize(x => x.WaitForNonStaleResultsAsOnNow())
Обновление: лучше использовать waitfornonstaleresultsasonnow (), чем wabtfornonstaleresults ()
РЕДАКТИРОВАТЬ: Почему это?
Причина в том, что ваш запрос создаст временный индекс, который автоматически будет удален после некоторого времени бездействия. Кроме того, они не выживут в перезапуске Ravendb. Теперь у вас есть несколько вариантов:
Продвигайте индекс, чтобы быть постоянным, используя студию управления
Создайте индекс в вашем приложении и используйте этот индекс при запросе
Подождите, пока Ворон самостоятельно оптимизируется и автоматически продвигает индекс (это произойдет только в том случае, если запрос будет запускать достаточно часто, что в вашем случае кажется маловероятным)
Используйте опцию .waitfornonstaleresuls (), как указано выше (это худший Потому что это может оказать очень негативное влияние на производительность приложения, и в этом нет необходимости, потому что другие варианты намного лучше)