2012-02-23 99 views
1

目前我在閱讀RavenDB doc後正在玩分面搜索。RavendDB分面搜索結果格式化

返回的結果是確定的,但存在一個小問題。由於結果當屬

IDictionary<string, IEnumerable<FacetValue>> 

有必要遍歷,並做一些花哨的字符串操作來格式化結果,並顯示在一個PartialView。更具體地說,本方面:

new Facet 
    { 
     Name = "Value_Range", 
     Mode = FacetMode.Ranges, 
     Ranges = 
      { 
       "[NULL TO Dx500.0]", 
       "[Dx500.0 TO Dx1000.0]", 
       "[Dx1000.0 TO Dx2500.0]", 
       "[Dx2500.0 TO Dx5000.0]", 
       "[Dx5000.0 TO NULL]", 
      } 
    } 

View代碼:

@fv.Range 

這是本 「美麗」 字符串,在視圖上獲取輸出:[Dx400.0 TO Dx600.0]

RavenDB使用上面的DX前綴做一個number to string conversion

Controller代碼,其中小結果傳遞給特定的ViewModel

var facetResults = DocumentSession.Query<Realty>("RealtyFacets") 
      //.Where(x => x.Value >= 100 && x.Value <= 1000) 
      .ToFacets("facets/RealtyFacets").ToArray(); 

var model = new RealtyFacetsViewModel(); 

model.Cities = facetResults[0]; 
model.Purposes = facetResults[1]; 
model.Types = facetResults[2]; 
model.Values = facetResults[3]; 

return PartialView("RealtyFacets", model); 

有正從一個面搜索結果,以便沒有字符串操作必須進行格式化返回的任何其他/更好的辦法數據?

Ayende的建議後,我做這在我的控制器:

foreach (var val in facetResults[3].Value) 
{ 
    switch(val.Range) 
    { 
     case "[Dx0.0 TO Dx200.0]": 
      val.Range = string.Format("{0:C2} {1} {2:C2}", 
             0, @Localization.to, 200); 
      break; 
     case "[Dx200.0 TO Dx400.0]": 
      val.Range = string.Format("{0:C2} {1} {2:C2}", 
             200, @Localization.to, 400); 
      break; 
     case "[Dx400.0 TO Dx600.0]": 
      val.Range = string.Format("{0:C2} {1} {2:C2}", 
             400, @Localization.to, 600); 
      break; 
     case "[Dx600.0 TO Dx800.0]": 
      val.Range = string.Format("{0:C2} {1} {2:C2}", 
             600, @Localization.to, 800); 
      break; 
     case "[Dx800.0 TO Dx1000000.0]": 
      val.Range = string.Format("{0:C2} {1} {2:C2}", 
             800, @Localization.to, 1000000); 
      break; 
    } 
} 

model.Values = facetResults[3]; 
+0

@我想補充到奧倫的回答,我實現了小API一樣,因爲它更容易;-)加上使得開發人員編寫的確切Lucene的查詢每個方面都有更大的靈活性。否則,API將不得不知道您想要使用的所有可能的分組方案。但作爲結果,API並不知道你的分組是什麼,它只是執行你給它的lucene查詢。 – 2012-02-24 09:35:31

+2

然而,通過使用轉換「Dx800.0」 - > 800.0的更通用代碼,您可以使代碼更簡單一些。在這裏看到如何RavenDB內部,https://github.com/ravendb/ravendb/blob/master/Raven.Abstractions/Indexing/NumberUtil.cs – 2012-02-24 10:07:59

+2

事實上,甚至更好的只是調用NumberUtils.StringToNumber(..)和有RavenDB將它轉換爲你。代碼位於Raven.Abstractions中,您可以在Client API中訪問該代碼。 – 2012-02-24 10:13:45

回答

2

@MattWarren suggestion,我最終使用:

foreach (var val in facetResults[3].Value) 
{ 
    // Original string format: [Dx5000.0 TO Dx10000.0] 
    var limits = val.Range.Split(new string[] { "TO", "[", "]", " " }, 
           StringSplitOptions.RemoveEmptyEntries); 

    // Leveraging RavenDB NumberUtil class... 
    val.Range = string.Format("{0:C0} {1} {2:C0}", 
    Raven.Abstractions.Indexing.NumberUtil.StringToNumber(limits.ElementAt(0)), 
    @Localization.to, 
    Raven.Abstractions.Indexing.NumberUtil.StringToNumber(limits.ElementAt(1)));  
} 
1

Leniel, 在你的代碼,創建一個字典,將在小值,顯示字符串之間的映射。目前RavenDB無法影響方面的價值。

+0

好的。我明白了。由於我沒有在視圖方面看到過這樣的例子,我認爲有一種方法可以從RavenDB本身獲得它的正確性...... – 2012-02-23 20:48:37