RavendDB форматирование результатов граненого поиска - PullRequest
1 голос
/ 23 февраля 2012

В настоящее время я играю с граненым поиском после прочтения RavenDB doc об этом.

Возвращенный результат в порядке, но есть небольшая проблема. Так как результат приходит как

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

Это строка " beautiful ", которая выводится на представление: [Dx400.0 TO Dx600.0]

RavenDB использует префикс Dx выше для преобразования числа в строку .

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);

Есть ли какой-либо другой / лучший способ получения результатов из многогранного поиска, чтобы не нужно было обрабатывать строки для форматирования возвращаемых данных?

После предложения Айенде я сделал это в своем контроллере:

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];

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

В соответствии с @ предложением Мэтт Уоррена , я использовал:

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 голос
/ 24 февраля 2012

Leniel, В вашем коде создайте словарь, который будет отображаться между значением фасета и отображаемой строкой. RavenDB в настоящее время не может влиять на значение фасета.

...