Linq RavenDB OrderByDescending和Take-结果不正确

Linq RavenDB OrderByDescending和Take-结果不正确,linq,ravendb,take,Linq,Ravendb,Take,直到最近,这个问题还对我有效。我现在在RavenDB中有135个InstallationSummary文档。它没有按开始时间获取最新的文档,而是基本上正常工作,但最后两个、最新的文档不会从此查询中显示。我问错了吗?有没有其他我应该注意的方法来处理OrderByDescending和RavenDB?我能正确查询的文档编号是否有限制 注意:我已经对此进行了调试,查询确实返回了我们在网格中看到的内容。在查询运行时间和UI中显示的内容之间没有进行转换 IEnumerable<Installatio

直到最近,这个问题还对我有效。我现在在RavenDB中有135个InstallationSummary文档。它没有按开始时间获取最新的文档,而是基本上正常工作,但最后两个、最新的文档不会从此查询中显示。我问错了吗?有没有其他我应该注意的方法来处理OrderByDescending和RavenDB?我能正确查询的文档编号是否有限制

注意:我已经对此进行了调试,查询确实返回了我们在网格中看到的内容。在查询运行时间和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();
IEnumerable安装摘要=
QueryAndCacheTag(session=>session.Advanced.LuceneQuery()
.Include(x=>x.ApplicationServerId)
.Include(x=>x.ApplicationWithOverrideVariableGroup.ApplicationId)
.Include(x=>x.ApplicationWithOverrideVariableGroup.CustomVariableGroupId)
.OrderByDescending(summary=>summary.InstallationStart)
.Take(numberToRetrieve)).Cast().ToList();
此网格中应显示更多行,开始时间大于2012年1月19日下午6:33:51:

编辑:我从查询中删除了Take(numbertorretrieve),在总共160个InstallationSummary文档中,我只得到128个。我可以在RavendbStudio中看到所有160个,但只有128个查询返回。128... 128... 2的力量。。。我达到极限了吗

好吧,看起来我已经达到了128的极限:

但是为什么呢?这里有一个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();
使用Raven.Client.Linq;
DateTime startDate=新的日期时间(2012,1,18);
IEnumerable安装摘要=
QueryAndCacheTag(session=>session.Query()
.Include(x=>x.ApplicationServerId)
.Include(x=>x.ApplicationWithOverrideVariableGroup.ApplicationId)
.Include(x=>x.ApplicationWithOverrideVariableGroup.CustomVariableGroupId)
.其中(x=>x.InstallationStart>startDate)
.OrderByDescending(summary=>summary.InstallationStart)
.Take(数字检索)
).Cast().ToList();

我不得不从LuceneQuery改为just Query,还必须添加Where子句。

RavenDB默认使用最终一致性,因此索引可以是s

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

  .Customize(x => x.WaitForNonStaleResultsAsOfNow())

RavenDB默认使用最终一致性,因此索引可以是s

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

  .Customize(x => x.WaitForNonStaleResultsAsOfNow())

终于解决了真正的问题

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();
IEnumerable安装摘要=
QueryAndCacheTag(session=>session.Query()
.Include(x=>x.ApplicationServerId)
.Include(x=>x.ApplicationWithOverrideVariableGroup.ApplicationId)
.Include(x=>x.ApplicationWithOverrideVariableGroup.CustomVariableGroupId)
.其中(x=>x.InstallationStart>startDate)
.OrderByDescending(summary=>summary.InstallationStart)
.Take(数字检索))
.Cast()
.ToList();
QueryAndCacheTags(..)函数的签名是
Func
,而不是
Expression
。它返回
IEnumerable
not
IQueryable

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

其余语句,然后在内存中应用于返回的128项。因此,您无法正确地查看已排序或筛选的项目

还有更多的信息和信息


通常,您不必担心
Func
Expression
之间的差异,编译器会为您处理它。但是,如果您在LINQ语句中引入自己的函数调用,那么您确实需要正确地执行它。

最终解决了真正的问题

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();
IEnumerable安装摘要=
QueryAndCacheTag(session=>session.Query()
.Include(x=>x.ApplicationServerId)
.Include(x=>x.ApplicationWithOverrideVariableGroup.ApplicationId)
.Include(x=>x.ApplicationWithOverrideVariableGroup.CustomVariableGroupId)
.其中(x=>x.InstallationStart>startDate)
.OrderByDescending(summary=>summary.InstallationStart)
.Take(数字检索))
.Cast()
.ToList();
QueryAndCacheTags(..)函数的签名是
Func
,而不是
Expression
。它返回
IEnumerable
not
IQueryable

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

其余语句,然后在内存中应用于返回的128项。因此,您无法正确地查看已排序或筛选的项目

还有更多的信息和信息


通常,您不必担心
Func
Expression
之间的差异,编译器会为您处理它。但是,如果在LINQ语句中引入自己的函数调用,则确实需要正确执行。

除此之外,什么是QueryAndCacheTags?这似乎很奇怪,特别是因为RavenDB已经为YouQueryAndCacheTags()执行了查询,并将etags存储在缓存中,以备以后保存对象时使用。因为我不会在应用程序的生命周期内保持会话打开状态,用户可以在检索后几个小时内保存一些内容