C# 4.0 我应该放弃RavenDB的整数ID吗?

C# 4.0 我应该放弃RavenDB的整数ID吗?,c#-4.0,indexing,ravendb,C# 4.0,Indexing,Ravendb,更新:这里的要点更充分地说明了这个问题 啊,更多更新。。。如果我将邮件类的Id属性设置为字符串,那么一切都可以正常工作。我应该放弃整数ID吗 我有两种型号 public class Mailing { public int Id { get; set; } public string Sender { get; set; } public string Subject { get; set; } public DateTime Created { get; s

更新:这里的要点更充分地说明了这个问题


啊,更多更新。。。如果我将邮件类的Id属性设置为字符串,那么一切都可以正常工作。我应该放弃整数ID吗


我有两种型号

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)
                                               };
            }
        }
带有RecipientCount的公共类邮件:AbstractMultiMapIndexCreationTask
{
公开课成绩
{
public int MailingId{get;set;}
公共字符串MailingSubject{get;set;}
公共字符串MailingSender{get;set;}
公共int RecipientCount{get;set;}
}
带有RecipientCount()的公共邮件
{
AddMap(邮件=>来自邮件中的邮件
选择新的
{
MailingId=mailing.Id,
MailingSender=mailing.Sender,
MailingSubject=mailing.Subject,
RecipientCount=0
});
AddMap(收件人=>收件人中的收件人
选择新的
{
recipient.MailingId,
MailingSender=(字符串)null,
MailingSubject=(字符串)null,
RecipientCount=1
});
Reduce=results=>from result in results
按result.MailingId对结果进行分组
进入g
选择新的
{
MailingId=g.键,
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());
        }
public ActionResult Index()
{
返回视图(RavenSession)
.Query()
.OrderByDescending(m=>m.MailingId)
.Take(10)
.ToList());
}
我得到:

System.FormatException:System.FormatException:输入字符串不正确 以正确的格式。在System.Number.StringTonNumber(字符串str, NumberStyles选项、NumberBuffer&number、NumberFormatInfo信息、, 布尔(十进制)


感谢任何帮助

是的,整数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
                           };
    }
}
此外,您可能不应该在单元测试中扫描程序集以查找索引。您可能会引入不属于测试内容的索引。更好的方法是单独创建索引,如下所示:

documentStore.ExecuteIndex(new MailingWithRecipientCount());

是的,整数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
                           };
    }
}
此外,您可能不应该在单元测试中扫描程序集以查找索引。您可能会引入不属于测试内容的索引。更好的方法是单独创建索引,如下所示:

documentStore.ExecuteIndex(new MailingWithRecipientCount());

精彩的附加信息。谢谢精彩的附加信息。谢谢