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());
精彩的附加信息。谢谢精彩的附加信息。谢谢