1

我有一个“消息”课程:

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 中,我可以非常成功地查询类似的内容,它会在 'To'、'From' 或 'Title' 中与 Chris 一起Query:Chris带来一切,这很棒。Messages

我的问题是如何从.NET 查询?我试过了:

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

哪个有效,我想做的是:

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

但是,raven(非常正确)不知道如何处理'm',因为大概我需要以某种方式查询Query。这Advanced条路线是唯一对我开放的吗?我很高兴更改索引定义,我使用了非泛型AbstractIndexCreationTask,因为我在m.To.Select(r=>r.Name)最后做了一些不会在 C# 中编译,但在 Raven 中以我想要的方式解释,但会如果需要,会很乐意更改为通用的!

4

1 回答 1

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。您想利用很多转义逻辑。

于 2013-10-12T16:39:28.553 回答