2

更新:問題をより完全に示す要点は次のとおりですhttps://gist.github.com/pauldambra/5051550


ああ、もっと更新... MailingクラスのIdプロパティを文字列にすると、すべて機能します。整数IDをあきらめるべきですか?


私は2つのモデルを持っています

public class Mailing
{
    public int Id { get; set; }
    public string Sender { get; set; }
    public string Subject { get; set; }
    public DateTime Created { get; set; }
}

public class Recipient
{
    public Recipient()
    {
        Status = RecipientStatus.Pending;
    }
    public RecipientStatus Status { get; set; }
    public int MailingId { get; set; }
}

私のホームページで、最後の10通のメールを取得したいと思います。受信者の数(最終的には異なるステータスの受信者の数ですが...)

私は次のインデックスを作成しました

public class MailingWithRecipientCount : AbstractMultiMapIndexCreationTask<MailingWithRecipientCount.Result>
        {
            public class Result
            {
                public int MailingId { get; set; }
                public string MailingSubject { get; set; }
                public string MailingSender { get; set; }
                public int RecipientCount { get; set; }
            }

            public MailingWithRecipientCount()
            {
                AddMap<Mailing>(mailings => from mailing in mailings
                                                 select new
                                                            {
                                                                MailingId = mailing.Id,
                                                                MailingSender = mailing.Sender,
                                                                MailingSubject = mailing.Subject,
                                                                RecipientCount = 0
                                                            });
                AddMap<Recipient>(recipients => from recipient in recipients
                                                    select new
                                                               {
                                                                   recipient.MailingId,
                                                                   MailingSender = (string) null,
                                                                   MailingSubject = (string)null,
                                                                   RecipientCount = 1
                                                               });
                Reduce = results => from result in results
                                    group result by result.MailingId
                                    into g
                                    select new
                                               {
                                                   MailingId = g.Key,
                                                   MailingSender = g.Select(m => m.MailingSender)
                                                                    .FirstOrDefault(m => m != null),
                                                   MailingSubject = g.Select(m => m.MailingSubject)
                                                                     .FirstOrDefault(m => m != null),
                                                   RecipientCount = g.Sum(r => r.RecipientCount)
                                               };
            }
        }

を使用してクエリします

public ActionResult Index()
        {
            return View(RavenSession
                        .Query<RavenIndexes.MailingWithRecipientCount.Result, RavenIndexes.MailingWithRecipientCount>()
                        .OrderByDescending(m => m.MailingId)
                        .Take(10)
                        .ToList());
        }

そして私は得る:

System.FormatException:System.FormatException:入力文字列が正しい形式ではありませんでした。System.Number.StringToNumber(String str、NumberStyles options、NumberBuffer&number、NumberFormatInfo info、Boolean parseDecimal)で

助けていただければ幸いです

4

1 に答える 1

4

はい、整数IDは面倒です。これは主に、Ravenが常に完全な文字列のドキュメントキーを保存するためであり、キーまたは独自のIDをいつ使用するかを考え、適切に翻訳する必要があります。縮小するときは、intとstringのデータ型も揃える必要があります。

テストに合格するための最小要件は次のとおりです。

// in the "mailings" map
MailingId = mailing.Id.ToString().Split('/')[1],

// in the reduce
MailingId = g.Key.ToString(),

ただし、送信者と件名の文字列を除外することで、インデックスを大幅に小さくし、パフォーマンスを向上させることができます。あなたはただそれらを変形で入れることができます。

これは、同じことを行う単純化された完全なインデックスです。

public class MailingWithRecipientCount : AbstractIndexCreationTask<Recipient, MailingWithRecipientCount.Result>
{
    public class Result
    {
        public int MailingId { get; set; }
        public string MailingSubject { get; set; }
        public string MailingSender { get; set; }
        public int RecipientCount { get; set; }
    }

    public MailingWithRecipientCount()
    {
        Map = recipients => from recipient in recipients
                            select new
                            {
                                recipient.MailingId,
                                RecipientCount = 1
                            };

        Reduce = results => from result in results
                            group result by result.MailingId
                            into g
                            select new
                            {
                                MailingId = g.Key,
                                RecipientCount = g.Sum(r => r.RecipientCount)
                            };

        TransformResults = (database, results) =>
                           from result in results
                           let mailing = database.Load<Mailing>("mailings/" + result.MailingId)
                           select new
                           {
                               result.MailingId,
                               MailingSubject = mailing.Subject,
                               MailingSender = mailing.Sender,
                               result.RecipientCount
                           };
    }
}

余談ですが、RavenDB.Tests.Helpersパッケージについて知っていましたか?RavenTestBaseそれはあなたがあなたのためにほとんどすべてのレッグワークを行うことからあなたが継承することができる単純な基本クラスを提供します。

using (var store = NewDocumentStore())
{
    // now you have an initialized, in-memory, embedded document store.
}

また、単体テストでインデックスのアセンブリをスキャンするべきではないでしょう。テスト対象の一部ではないインデックスを導入する場合があります。より良いルートは、次のようにインデックスを個別に作成することです。

documentStore.ExecuteIndex(new MailingWithRecipientCount());
于 2013-02-27T22:48:30.750 に答える