2012-02-23 67 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