如何在RavenDB Lucene查询中包含日期条件

时间:2013-03-16 08:38:01

标签: c# linq lucene ravendb

我在RavenHQ中有以下索引

from doc in docs 
let Tag = doc["@metadata"]["Raven-Entity-Name"]
where  Tag != null && Tag=="Email"
select new { Tag, LastModified = (DateTime)doc["@metadata"]["LastModified"], DateAdded=doc.DateAdded };

我也确实将DateAdded Indexing分析为。我想写一个Lucene查询,其中包含where子句中的 小于日期 条件。

我试过了,但它没有用。

Where("DateAdded: [NULL TO 2012-12-31").ToList()

C#在where子句中提供日期的确切方式是什么。

感谢。

1 个答案:

答案 0 :(得分:5)

最好的方法是使用Raven的API,而不是自己构建查询:

var date = new DateTime(2012, 12, 31, 0, 0, 0, DateTimeKind.Utc);
session.Advanced.LuceneQuery<object>().WhereLessThan("LastModified", date);

如果你必须自己做,就像这样:

session.Advanced.LuceneQuery<object>()
                .Where("LastModified: {NULL TO 2012-12-31T00:00:00.0000000Z}")

Raven使用与Lucene Range Query Syntax日期时间格式配对的ISO8601到7位小数,由dateTime.ToString("o")提供的Round Trip Format提供。

请注意,您说“小于”,所以我使用了独占方括号{ TO }。如果您想要“小于或等于”,那么您可以使用包含方括号[ TO ]代替。

如果您包含结尾的]字符,那么您在问题中提供的查询就会有效。但是,它不会是你想要的,因为任何带有时间组件的LastModified条目都会在你指定的值之后下降。

另请注意,LastModified元数据存储为UTC。