当您表达 LINQ 查询时,请记住 RavenDB 必须在执行之前将其转换为 Lucene。因此,您需要考虑如何将特定字段与您传入的值进行比较。您写道:
Where(x => DateTime.Now > x.LastUpdated.AddMinutes(8))
您的LastUpdated
字段需要为每条记录进行变异才能解析此查询。这不是 Lucene 或 Raven 可以做到的。仅仅因为你可以在 LINQ 中表达它并不意味着它对 Raven 有效。相反,你可以写:
Where(x => x.LastUpdated < DateTime.Now.AddMinutes(-8))
这是您指定的查询的代数等价物,应该可以工作,但仍然存在一些问题。
您可能想要一个包容性比较,<=
或者>=
该查询将返回早于 8 分钟之前的项目。我可能是错的,但我认为你的意思是你想要8 分钟前更新的项目,在这种情况下你会翻转比较:
Where(x => x.LastUpdated >= DateTime.Now.AddMinutes(-8))
使用DateTime.Now
可能会有问题。您正在将服务器的本地时区设置强加到您的数据上。如果您的时区使用夏令时,那么当您的时钟转换时,每年两次您的查询都会得到错误的结果。即使您不遵循夏令时,如果您想将数据移动到其他地方(如云或 ISP),也会遇到问题。您还应该阅读我的帖子:反对 DateTime.Now 的案例。您应该将日期存储为 UTC,或者您可以使用DateTimeOffset
- 它在 RavenDB 中运行良好。
也许您没有意识到,但 RavenDB 已经Last-Modified
在其元数据中为每个文档保留了一个值。如果您愿意,您可以使用自己的字段,但为什么要存储两次呢?您可以使用 Lucene 语法基于元数据进行查询:
var results = session.Advanced.LuceneQuery<EmailTempKey>()
.WhereGreaterThan("@metadata.Last-Modified",
DateTime.UtcNow.AddMinutes(8));
如果您想坚持使用 LINQ 语法,则需要定义一个静态索引。