2013-02-27 37 views
2

更新:這是一個依據更充分說明了這個問題https://gist.github.com/pauldambra/5051550我應該放棄Integer ID for RavenDB嗎?


啊,更多更新...如果我做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(字符串str, 的NumberStyles選項,NumberBuffer &數的NumberFormatInfo信息,布爾 parseDecimal)

任何幫助表示讚賞

回答

4

是的,整IDS是一種痛苦。這主要是因爲Raven總是存儲一個完整的字符串文檔密鑰,並且您必須考慮何時使用密鑰或您自己的id並適當地進行翻譯。減少時,還需要對齊int和字符串數據類型。

最低,讓您的測試通過爲:

// 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()); 
+1

輝煌的附加信息。謝謝! – 2013-02-28 09:39:17

相關問題