У меня довольно простая модель:
public class PhraseMeta:
{
public int Id { get; set; }
public string ModuleName { get; set; }
public string Description { get; set; }
public DateTime ModifiedDate { get; set; }
}
public class Phrase
{
public int Id { get; set; }
public int PhraseMetaId { get; set; } //reference to PhraseMeta
public string Language { get; set; }
public string Text { get; set; }
}
Фраза содержит несколько переводов, а ФразаМета имеет метаинформацию для нескольких фраз.Я пытаюсь найти текст фразы, имеющий ModuleName и язык.Как я понял, функция RavenDB Multi Maps / Reduce indexes может помочь с этим вместо использования WhereEntityIs.Мой индекс:
public class PhraseEntry
{
public string MetaId { get; set; }
public string ModuleName { get; set; }
public string Language { get; set; }
public string Text { get; set; }
}
public class PhraseTranslationIndex : AbstractMultiMapIndexCreationTask<PhraseEntry>
{
public PhraseTranslationIndex()
{
this.AddMap<PhraseMeta>(phraseMetas => from pm in phraseMetas
select new
{
MetaId = pm.Id,
ModuleName = pm.ModuleName,
Language = (string)null,
Text = (string)null
});
this.AddMap<Phrase>(phrases => from phrase in phrases
select new
{
MetaId = phrase.PhraseMetaId,
ModuleName = (string)null,
Language = phrase.Language,
Text = phrase.Text
});
this.Reduce = results => from entry in results
group entry by entry.MetaId
into g
select new
{
MetaId = g.Key,
ModuleName = g.Select(x => x.ModuleName).Where(x => x != null).First(),
Language = g.Select(x => x.Language).Where(x => x != null).First(),
Text = g.Select(x => x.Text).Where(x => x != null).First()
};
this.Index(x => x.ModuleName, FieldIndexing.Analyzed);
this.Index(x => x.Language, FieldIndexing.Analyzed);
this.Index(x => x.Text, FieldIndexing.Analyzed);
}
}
Вот как я пытаюсь его использовать:
var entry = documentSession.Query<PhraseEntry, PhraseTranslationIndex>
.Where(p => p.ModuleName == "MyModule")
.Where(p => p.Language == "en")
.FirstOrDefault();
И этот индекс не имеет результатов.Я использую сборку 472.
Есть идеи?