c# - 如何在 RavenDB 中为嵌套日期建立索引

标签 c# ravendb

我可能在这里咆哮完全错误的树但是......我有一个 RavenDB,其中存储了很多 RavenPerson 类型的对象。

每个 RavenPerson 都有一个邮寄机构列表,每个邮件机构都有一个相关联的日期。

{
  "Bodies": [
    {
      "RenewalRunDate": "2011-11-30T00:00:00.0000000+00:00",
      "BodyText": "A bunch of text"
    }
  ]
}

我想获取给定的日期并获取此人的 ID 和相关正文文本的列表。

所以...

    public class MailingsByDate : AbstractIndexCreationTask<RavenPerson, PersonMailingModel>
    {
        public MailingsByDate()
        {
            Map = people =>
                  people.SelectMany(person => person.Bodies,
                                    (person, body) =>
                                    new PersonMailingModel
                                        {
                                            MembershipNumber = person.MembershipNumber,
                                            MailingBody = body.BodyText,
                                            MailingDate = body.RenewalRunDate
                                        });
        }
    }

但是当我调用它的时候

        var mailings = DocumentSession.Query<PersonMailingModel, MvcApplication.MailingsByDate>()
                                      .Where(pmm => pmm.MailingDate == date.Value);

我得到一个异常

Unable to cast object of type 'IntegraRenewalMailLibrary.RavenPerson' to type 'RenewalLogs.Models.PersonMailingModel'.

提前致谢!


更新: 如下所示更改对索引的调用不会解决异常

        var mailings = DocumentSession.Query<PersonMailingModel, MvcApplication.MailingsByDate>()
                                      .Where(pmm => pmm.MailingDate == date.Value)
                                      .As<PersonMailingModel>()
                                      .ToList();

更新更新: 我在这里创建了一个带有示例测试用例的 visual studio 解决方案:https://github.com/pauldambra/IndexExploration

使用版本 1.0.888

我绝对没有完全了解索引中发生的事情,所以我猜这是我没有做对或试图做错事......


Ayende 向我指出了 Twitter 上的解决方案,即使用 SelectMany 调用索引并将其替换为使用 linq 查询表单的调用

    public class RecipientsByDate : AbstractIndexCreationTask<Person, PersonMailing>
    {
        public RecipientsByDate()
        {
            Map = people => from person in people
                            from body in person.Bodies
                            select new PersonMailing
                                       {
                                           MembershipNumber = person.MembershipNumber,
                                           MailingBody = body.BodyText,
                                           MailingDate = body.MailingDate
                                       };

        }
    }

最佳答案

在此调用结束时调用 As()

关于c# - 如何在 RavenDB 中为嵌套日期建立索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10660670/

相关文章:

c# - 如何使用 LINQ 按深度级别对对象层次结构进行排序?

c# - sql表转xml

RavenDB分页行为

nuget - RavenDB和SignalR Nuget包依赖关系冲突

c# - Linq - 使用谓词的查询运算符 'Where' 不支持重载

c# - 通过 Web 服务 API 的 Web Scraper?

c# - 如何在业务逻辑层设计数据传输对象

c# - 查询RavenDB索引中的单独集合(WHERE IN)

ravendb - 返回 IQueryable 但需要 Raven 统计信息才能插入 TotalResults header

c# - 复杂 RavenDb 对象中的延迟加载