【问题标题】:How to query RavenDB static index when projection is anonymous type?投影为匿名类型时如何查询RavenDB静态索引?
【发布时间】:2025-12-18 00:10:01
【问题描述】:

我有一个“消息”类:

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 与 Chris 一起显示在“To”、“From”或“Title”中,这很棒。

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

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

可行,但是我想做的是:

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

但是,raven(非常正确)不知道如何处理“m”,因为大概我需要以某种方式查询QueryAdvanced 路线是唯一对我开放的路线吗?我很高兴更改索引定义,我使用了非通用的AbstractIndexCreationTask,因为我在最后做了一个m.To.Select(r=&gt;r.Name) 位,它不会在 C# 中编译,但以我的方式解释想要在 Raven 中,但如果需要,会并且很乐意更改为通用的!

【问题讨论】:

    标签: c# ravendb indexing


    【解决方案1】:

    你可能的意思是你想做:

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

    【讨论】: