Как создать индекс RavenDB, который возвращает список строк? - PullRequest
5 голосов
/ 10 декабря 2011

У меня есть коллекция документов «WineDocument» на форме:

{
  "Name": "Barbicato Morellino Di Scansano",
  "Country": "Italy",
  "Region": "Tuscany",
}

Мне нужно сделать запрос, чтобы найти все уникальные значения поля «Страна».Я пытался создать индекс, который выглядит примерно так:

class WineCountriesIndex: AbstractIndexCreationTask<WineDocument, string> {
        public BeverageCountriesIndex() {
            Map = wines => from wine in wines
                           where wine.Country != null
                           select new { Key = wine.Country };
            Reduce = results => from result in results
                                group result by result into g
                                select new { Key = g.Key };
        }
    }

Индекс создается нормально, и я пытаюсь использовать его со следующим кодом:

IList<string> countries = session.Query<string, WineCountriesIndex>().ToList();

Но это даетJsonSerializationException: «Невозможно десериализовать объект JSON в тип« System.String ».».Я думаю, это потому, что синтаксический анализатор Json не может разобрать {Key = "Italy} в строку. Но я не знаю, как заставить карту / уменьшить возвращать только строку.

Ответы [ 2 ]

7 голосов
/ 10 декабря 2011

Я не знаю, лучший ли это способ, но я решил это.Я создал индекс, похожий на:

class WineCountriesIndex: AbstractIndexCreationTask<WineDocument, WineCountriesIndex.Result> {
    public class Result {
        public string Country { get; set; }
    }

    public WineCountriesIndex() {
        Map = wines => from wine in wines
                       where wine.Country != null
                       select new { Country = wine.Country };
        Reduce = results => from result in results
                            group result by result.Country into g
                            select new { Country = g.Key };
    }
}

Затем я использую этот код для выполнения фактического запроса:

using(IDocumentSession session = _store.OpenSession()) {
    return session.Query<WineCountriesIndex.Result, WineCountriesIndex>().Select(country => country.Country).ToList();
}
1 голос
/ 11 декабря 2011

Проблема в том, что ваш индекс не выводит строку, он выводит объект со свойством Key, являющимся строкой. Если вы действительно хотите, вы делаете прогноз, но я думаю, что Дэвид отвечает лучше.

...