在 RavenDB 中处理带点的前缀

Posted

技术标签:

【中文标题】在 RavenDB 中处理带点的前缀【英文标题】:Handling prefix with dot in RavenDB 【发布时间】:2016-09-01 10:16:49 【问题描述】:

我已经开始在 C# 项目中使用 RavenDB。我有结构文件:


  "MessageId": "8c34dec8-e6fe-6bee-2dc6-2cf83e374090",
  "Headers": 
    "Header.MessageId": "14f6cdf3-142d-4ab0-9610-a65600f1f460",
    "Header.Timestamp": "2016-08-02 12:40:55:783130 Z",
    "$.diagnostics.host": "1ddc6cefd4d776f1de8fefc33a45d020",
  ,
  "Timestamp": "2016-08-02T12:43:25.3914940Z"

我可以通过 MessageId 获取文档:

var doc = session.Query<Messages>().Where(w => w.MessageId == "8c34dec8-e6fe-6bee-2dc6-2cf83e374090").ToList();

但我想通过:Headers.Header.MessageId 获取文件。 不幸的是,在 Headers 中有带前缀(Header 和 $)的键,我不知道如何在 session.Query&lt;Messages&gt;() 语句中处理它。

我可以在 RavenDB Studio 中完成:

from doc in docs.Messages
where doc.Headers["Header.MessageId"] == "14f6cdf3-142d-4ab0-9610-a65600f1f460"
select new  
    Id = doc.MessageId,
    MessageId = doc.Headers["Header.MessageId"]

我尝试创建 Lucene 查询,但它不起作用:

var doc = session.Advanced.LuceneQuery<object>().WhereEquals("Headers.Header.MessageId", "14f6cdf3-142d-4ab0-9610-a65600f1f460").ToList();

你能告诉我我做错了什么并请帮助我吗?

【问题讨论】:

我面临同样的问题,用点(。)选择键的解决方案是什么。在我的情况下,它总是在使用 doc.MessageId 时返回空值,并在 doc.Headers["Header.MessageId"] 的情况下返回错误消息。 【参考方案1】:

您的文档是由管理层创建的吗?因为您的文档不能在 .net 类中表示(也可以由 Messages 表示)(您不能有带点的属性名称),这意味着您无法加载文档;您需要修补文档(以删除点)

【讨论】:

以上是关于在 RavenDB 中处理带点的前缀的主要内容,如果未能解决你的问题,请参考以下文章

RavenDb:在单元测试时强制索引等到不陈旧

RavenDB 使用 Raven.Smuggler 在 RavenDB 服务器之间导出/导入数据

Ravendb 工作室认证

我可以在 RavenDB 中使用构造函数重载吗?

RavenDB 全文搜索

RavenDB 会话 > 30