.net nosql mapreduce ravendb

.net - RavenDB: Cómo usar Multi Maps/Reducir índices



nosql mapreduce (1)

Tengo un modelo bastante simple:

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

La frase contiene algunas traducciones y PhraseMeta tiene metainformación para varias frases. Estoy tratando de encontrar el texto de la frase con ModuleName e Idioma. Como entendí, la función de índices múltiples / reducciones de RavenDB puede ayudar con esto en lugar de usar WhereEntityIs. Mi índice es:

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

Así es como estoy tratando de usarlo:

var entry = documentSession.Query<PhraseEntry, PhraseTranslationIndex> .Where(p => p.ModuleName == "MyModule") .Where(p => p.Language == "en") .FirstOrDefault();

Y este índice no tiene resultados. Estoy usando compilación 472.

¿Algunas ideas?


El problema es que probablemente estés usando First (), intenta usar FirstOrDefault ()