2013-10-08 2 views
1

У меня есть «сообщение» класс:Как запросить статический индекс RavenDB, когда проекция является анонимным типом?

public class User { public string Name { get;set; } /*Other properties*/ } 
public class Message { 
    public User From { get;set; } 
    public ICollection<User> To { get;set; } 
    public string Title { get;set; } 
    /* Others */ 
} 

И я индекс определяется следующим образом: (да, прямо из «Я следующий в видео-учебник»)

public class Message_ToFromTitle : AbstractIndexCreationTask 
{ 
    public override IndexDefinition CreateIndexDefinition() 
    { 
     return new IndexDefinition 
     { 
      Map = "from m in docs.Messages select new { Query = new[] { m.Title, m.From.Name, m.To.Select(r => r.Name), } }", 
      Indexes = {{"Query", FieldIndexing.Analyzed}} 
     }; 
    } 
} 

Который в Management Studio я могу запросить довольно успешно с такими вещами, как Query:Chris, и он принесет все Messages с Крисом в «To», «From» или «Title», что отлично.

Моя проблема заключается в том, как я могу выполнить запрос из .NET? Я пробовал:

session.Advanced.LuceneQuery<Message, Message_ToFromTitle>().Where("Query:Chris"); 

, который работает, но , что я хотел бы сделать, это:

session.Query<Message, Message_ToFromTitle>().Where(m => m == "Chris"); 

Но, Ворон (совершенно справедливо) не знает, что делать с 'm', по-видимому, мне нужно как-то запросить Query. Является ли маршрут Advanced единственным открытым для меня? Я очень рад изменить определение индекса, я использовал неоригинальный AbstractIndexCreationTask, поскольку я делаю бит m.To.Select(r=>r.Name) в конце, который не будет компилироваться на C#, но интерпретируется так, как я хочу в Raven, но будет и с радостью изменится на общий, если понадобится!

ответ

0

Вы, вероятно, означает, что вы хотите сделать:

session.Query<Message, Message_ToFromTitle>().Where(m => m.Query == "Chris"); 

И чтобы быть в состоянии сделать это в строго типизированных образом вы должны обеспечить клиента API одном классе RavenDB может работать тип с. Что-то, как это будет работать:

session.Query<MessageClassForQuerying, Message_ToFromTitle>().Where(m => m.Query == "Chris"); 

Где:

public class MessageClassForQuerying : Message { 
    public string Query { get; set; } 
} 

Но используя Advanced.LuceneQuery часть совершенно нормально.

Кроме того, при использовании Advanced.LuceneQuery вы хотите использовать WhereEquals() или Search(), а не где напрямую. Существует очень много логики, которые вы хотите использовать.

Смежные вопросы