我在这里准备了完整的测试用例: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遗憾的是,它并没有给我带来解决方案。
最佳答案
通过单元测试的最简单的索引是:
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
};
}
}
关于indexing - 如何查询 RavenDB 中具有日期范围的子集合的索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15586057/