如何查询具有日期范围在RavenDB中的子集合的索引?

时间:2013-03-23 11:11:55

标签: indexing ravendb

我在这里准备了完整的测试用例:https://gist.github.com/pkrakowiak/cc8addf5725193a01f2d

Location个文件。在某些时间段内,每个位置可以有零个或多个赞助商(由IList<Sponsorship> Sponsors属性表示)。我只需要返回特定日期赞助的那些地点(例如我的例子中的3月15日)。因此,此类位置必须至少有一个与以下查询匹配的Sponsorship实例:.Where(x => x.Sponsors.Any(s => s.From <= today && s.To >= today))

我准备了两个测试,一个是没有明确使用索引:CanGetCurrentlySponsoredLocations,而是使用我创建的静态索引:CanGetCurrentlySponsoredLocationsUsingStaticIndex。第一个将通过,第二个将失败。问题是 - 如何进行第二次测试?我需要对Locations_ByCoordinates索引应用哪些修改?

如果您想知道索引名称的来源或评论的位置 - 请忽略它们。 :)它们是我正在测试的其他东西的残羹剩饭。

更新

我首先将此问题提交给官方RavenDB Google小组:https://groups.google.com/forum/?fromgroups=#!topic/ravendb/ySUPXqkpTA8可悲的是,它没有给我带来解决方案。

1 个答案:

答案 0 :(得分:0)

通过单元测试的最简单的索引是:

private class Locations_ByCoordinates : AbstractIndexCreationTask<Location>
{
    public Locations_ByCoordinates()
    {
        Map = locations => from l in locations
                           from s in l.Sponsors
                           select new
                           {
                               Sponsors_From = s.From,
                               Sponsors_To = s.To
                           };
    }
}

您可能想要选择一个更好的名称,因为坐标没有编入索引。

我不确定你的其他测试CanSortOnSponsorshipStatus是什么。

<强>更新

要包含没有赞助商的位置,请使用DefaultIfEmpty linq扩展方法。这将确保所有位置至少有一个索引条目。

private class Locations_ByCoordinates : AbstractIndexCreationTask<Location>
{
    public Locations_ByCoordinates()
    {
        Map = locations => from l in locations
                           from s in l.Sponsors
                                      .DefaultIfEmpty(new Sponsorship
                                      {
                                        From = DateTime.MinValue,
                                        To = DateTime.MaxValue
                                      })
                           select new
                           {
                               Sponsors_From = s.From,
                               Sponsors_To = s.To
                           };
    }
}