Linq RavenDB OrderByDescending和Take-结果不正确
直到最近,这个问题还对我有效。我现在在RavenDB中有135个InstallationSummary文档。它没有按开始时间获取最新的文档,而是基本上正常工作,但最后两个、最新的文档不会从此查询中显示。我问错了吗?有没有其他我应该注意的方法来处理OrderByDescending和RavenDB?我能正确查询的文档编号是否有限制 注意:我已经对此进行了调试,查询确实返回了我们在网格中看到的内容。在查询运行时间和UI中显示的内容之间没有进行转换Linq RavenDB OrderByDescending和Take-结果不正确,linq,ravendb,take,Linq,Ravendb,Take,直到最近,这个问题还对我有效。我现在在RavenDB中有135个InstallationSummary文档。它没有按开始时间获取最新的文档,而是基本上正常工作,但最后两个、最新的文档不会从此查询中显示。我问错了吗?有没有其他我应该注意的方法来处理OrderByDescending和RavenDB?我能正确查询的文档编号是否有限制 注意:我已经对此进行了调试,查询确实返回了我们在网格中看到的内容。在查询运行时间和UI中显示的内容之间没有进行转换 IEnumerable<Installatio
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
notIQueryable
此时将语句从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
notIQueryable
此时将语句从IQueryable
转换为IEnumerable
。这意味着RavenDB服务器只处理查询的第一部分,没有过滤或排序
其余语句,然后在内存中应用于返回的128项。因此,您无法正确地查看已排序或筛选的项目
还有更多的信息和信息
通常,您不必担心
Func
和Expression
之间的差异,编译器会为您处理它。但是,如果在LINQ语句中引入自己的函数调用,则确实需要正确执行。除此之外,什么是QueryAndCacheTags?这似乎很奇怪,特别是因为RavenDB已经为YouQueryAndCacheTags()执行了查询,并将etags存储在缓存中,以备以后保存对象时使用。因为我不会在应用程序的生命周期内保持会话打开状态,用户可以在检索后几个小时内保存一些内容