RavenDB:查找范围内最近的日期
RavenDB: Find closest date in range
我正在尝试查询最接近我传递给查询的日期的文档。
问题是 RavenDB 无法翻译我的查询:
InvalidOperationException: Cannot understand how to translate Abs
这是我正在尝试的查询:
_session.Query<ExchangeRate>().OrderBy(d => Math.Abs((date - d.TimeStamp).Ticks)).First();
如果 RavenDB 无法翻译这些 Math 函数,还有哪些其他选项可以编写此类查询?
更新 1
根据 Ayende 的回答,我尝试了以下似乎有效的方法,但不确定它是否是最佳解决方案。它还会考虑日期是否超出可用数据的范围,它只是 returns null 要通过调用代码处理。
var rateBefore = _session.Query<ExchangeRate>()
.Where(x => x.TimeStamp.Date <= date.Date)
.OrderByDescending(x => x.TimeStamp)
.FirstOrDefault();
var rateAfter = _session.Query<ExchangeRate>()
.Where(x => x.TimeStamp.Date >= date.Date)
.OrderBy(x => x.TimeStamp)
.FirstOrDefault();
if (rateBefore == null || rateAfter == null)
return rateBefore ?? rateAfter;
var beforeDiff = Math.Abs(rateBefore.TimeStamp.Ticks - date.Ticks);
var afterDiff = Math.Abs(rateAfter.TimeStamp.Ticks - date.Ticks);
return beforeDiff <= afterDiff ? rateBefore : rateAfter;
这需要遍历数据库中的所有数据。
相反,做两个查询。
获得第一个等于或小于日期的一个。
一个获取第一个等于或大于日期的。
然后选择最近的。
我正在尝试查询最接近我传递给查询的日期的文档。 问题是 RavenDB 无法翻译我的查询:
InvalidOperationException: Cannot understand how to translate Abs
这是我正在尝试的查询:
_session.Query<ExchangeRate>().OrderBy(d => Math.Abs((date - d.TimeStamp).Ticks)).First();
如果 RavenDB 无法翻译这些 Math 函数,还有哪些其他选项可以编写此类查询?
更新 1
根据 Ayende 的回答,我尝试了以下似乎有效的方法,但不确定它是否是最佳解决方案。它还会考虑日期是否超出可用数据的范围,它只是 returns null 要通过调用代码处理。
var rateBefore = _session.Query<ExchangeRate>()
.Where(x => x.TimeStamp.Date <= date.Date)
.OrderByDescending(x => x.TimeStamp)
.FirstOrDefault();
var rateAfter = _session.Query<ExchangeRate>()
.Where(x => x.TimeStamp.Date >= date.Date)
.OrderBy(x => x.TimeStamp)
.FirstOrDefault();
if (rateBefore == null || rateAfter == null)
return rateBefore ?? rateAfter;
var beforeDiff = Math.Abs(rateBefore.TimeStamp.Ticks - date.Ticks);
var afterDiff = Math.Abs(rateAfter.TimeStamp.Ticks - date.Ticks);
return beforeDiff <= afterDiff ? rateBefore : rateAfter;
这需要遍历数据库中的所有数据。 相反,做两个查询。 获得第一个等于或小于日期的一个。 一个获取第一个等于或大于日期的。
然后选择最近的。