2013-03-23 89 views
3

我這裏準備了完整的測試用例:https://gist.github.com/pkrakowiak/cc8addf5725193a01f2d如何查詢具有RavenDB中日期範圍的子集合的索引?

還有Location文件。每個位置在一段時間內可以有零個或多個贊助商(由IList<Sponsorship> Sponsors屬性表示)。我只需要返回那些在特定日期贊助的地點(例如3月15日的例子)。所以,這樣的位置必須符合以下查詢至少一個Sponsorship實例:.Where(x => x.Sponsors.Any(s => s.From <= today && s.To >= today))

我準備了兩個試驗,一個不使用索引明確:CanGetCurrentlySponsoredLocations,和一個它使用我創建了一個靜態指標:CanGetCurrentlySponsoredLocationsUsingStaticIndex。第一個會通過,第二個會失敗。問題是 - 我如何進行第二次測試?我需要對我的Locations_ByCoordinates索引進行哪些修改?

如果您想知道索引名稱來自哪裏或評論是什麼 - 只是忽略它們。 :)他們是我正在測試的其他東西的剩菜。

更新

我把這個問題首先官方RavenDB谷歌組:https://groups.google.com/forum/?fromgroups=#!topic/ravendb/ySUPXqkpTA8可悲的是,它並沒有給我一個解決方案。

回答

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是什麼。

UPDATE

要包括有沒有贊助商的位置,使用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 
          }; 
    } 
} 
+0

這沒有幫助 - 贊助是一對日期 - 從和到。以上將混合所有日期和查詢將無法按預期工作。在此處查看我的評論:https://groups.google.com/d/msg/ravendb/ySUPXqkpTA8/xTEPv_qGpKEJ 座標在我的真實索引中編入索引。 :)我只是不想在這裏添加額外的東西。 – 2013-03-29 11:12:52

+0

其實 - 不,他們沒有混合。每一對都在一個單獨的索引條目中。我在沒有3/11-3/15範圍的情況下運行了測試,並且如預期的那樣返回了零結果。如果你能證明另外,請用這個索引更新你的單元測試,並告訴我它失敗的地方。 – 2013-03-29 14:34:55

+0

此外,您可能會考慮使用包容性/排他性範圍's.From <=今天&& s.To>今天' - 否則您可能有重疊。 – 2013-03-29 14:36:18