如何为RavenDB中的嵌套日期编制索引

时间:2012-05-18 22:50:07

标签: c# ravendb

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

每个RavenPerson都有一个邮件正文列表,每个邮件正文都有一个相关的日期。

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

我想要一个给定的日期并获取该人的身份和相关正文的列表。

因此...

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

我得到了一个例外

  

无法转换“IntegraRenewalMailLibrary.RavenPerson”类型的对象   输入'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
                                       };

        }
    }

1 个答案:

答案 0 :(得分:1)

在此次通话结束时拨打As()