2

我在 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 索引设置为已分析。我想编写一个 Lucene 查询,它在 where 子句中包含小于日期的条件。

我试过跟随,但没有奏效。

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

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

谢谢。

4

1 回答 1

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 使用与ISO8601日期时间格式配对的Lucene 范围查询语法到小数点后 7 位,正如从 with 获得的往返格式提供的那样。dateTime.ToString("o")

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

]如果您包含了结束字符,您在问题中提供的查询将会起作用。但是,它不会是您要查找的内容,因为任何LastModified带有时间分量的条目都会在您指定的值之后下降。

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

于 2013-03-16T16:01:42.907 回答