2

这个查询直到最近才为我工作。现在我的 RavenDB 中有 135 个 InstallationSummary 文档。它不是按开始时间获取最新的,而是主要工作,但是最后一对,最近的文档没有从这个查询中显示出来。我查询不正确吗?有没有我应该注意的不同的方式来使用 RavenDB 进行 OrderByDescending 和 Take?我可以正确查询的文件数量是否有限制?

注意:我已经调试过了,查询确实返回了我们在网格中看到的内容。在查询运行时间和 UI 中显示的时间之间没有进行任何转换。

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();

此网格应在其中显示更多行,开始时间大于 2012 年 1 月 19 日下午 6:33:51:

在此处输入图像描述

编辑:我从查询中删除了 Take(numberToRetrieve),我只得到了 160 个 InstallationSummary 文档中的 128 个。我可以在 RavenDB Studio 中看到所有 160 个,但只有 128 个从查询返回。128... 128... 2 的幂... 我达到极限了吗?

好的,看起来我确实达到了 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/ravenb-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 子句。

4

2 回答 2

3

终于解决了真正的问题。

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();

QueryAndCacheEtags(..) 函数的签名是Func<T>,而不是Expression<Func<T>>。它IEnumerable<T>不返回IQueryable<T>

这会将语句从 转换IQueryable<T>IEnumerable<T>。这意味着 RavenDB 服务器只处理查询的第一部分,没有过滤或排序。

其余的语句,然后在内存中应用到您返回的 128 个项目。因此,为什么您没有看到正确排序或过滤的项目。

这里这里有更多信息

通常,您不必担心 和 之间的区别Func<T>Expression<Func<T>>编译器会为您处理。但是,如果您将自己的函数调用引入到 LINQ 语句中,则确实需要正确处理。

于 2012-01-29T15:19:04.763 回答
1

RavenDB 默认使用最终一致性,因此除非您明确指定,否则索引可能是陈旧的。

将下面的行(或其变体之一)添加到您的查询中:

  .Customize(x => x.WaitForNonStaleResultsAsOfNow())
于 2012-01-20T09:46:29.133 回答