投影是匿名类型时如何查询RavenDB静态索引?

时间:2013-10-08 15:36:00

标签: c# ravendb indexing

我有一个'留言'课程:

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

在管理工作室中,我可以使用Query:Chris之类的内容成功查询,并且它会将所有Messages与Chris一起带入“收件人”,“发件人”或“标题”,这很棒。

我的问题是如何从.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,但如果需要的话,愿意并且很乐意改变为通用的!

1 个答案:

答案 0 :(得分: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(),而不是直接使用Where。你想要利用很多逃避逻辑。