2013-10-08 35 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之类的东西,它会将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',据推测我需要以某种方式查询QueryAdvanced路线是唯一向我开放的路线吗?我很乐意改变索引定义,我使用非通用的AbstractIndexCreationTask,因为我在末尾做了m.To.Select(r=>r.Name)位,它不会在C#中编译,而是按照我想要的方式在Raven中进行解释,但是如果需要的话,会很乐意变成一个通用的!

回答

0

你可能说你想做的事:

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

,并能够做到这一点,你必须提供一个类RavenDB的客户端API可以计算出从类型强类型的方式。像这样将工作:

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(),而不是直接在哪里。有很多逃避逻辑,你想要利用。