3

我在这里准备了完整的测试用例: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遗憾的是,它没有给我带来解决方案。

4

1 回答 1

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是关于什么的。

更新

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

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
                           };
    }
}
于 2013-03-28T13:55:00.687 回答