2013-10-08 43 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(),而不是直接在哪裏。有很多逃避邏輯,你想要利用。