我正在尝试从ravendb中选择并更新多行,但它以递归方式更新相同的行。即前100行。没有变化。
这是我的代码。如何选择某些行,更新每行的某些字段并一次又一次地执行,直到我的工作完成。
var currentEmailId = 100;
using (var session = store.OpenSession())
{
var goon = true;
while(goon){
var contacts = session.Query<Contacts>().Where(f => f.LastEmailId < currentEmailId).Take(100);
if(contacts.Any()){
foreach(var contact in contacts){
EmailOperation.Send(contact, currentEmailId);
contact.LastEmailId = currentEmailId;
}
session.SaveChanges();
}
else{
goon = false
}
}
}
答案 0 :(得分:1)
这可能是因为您在保存更改后立即执行查询,而不会在保存更改后更新索引。因此,你回来了相同的项目。要解决此问题,您可以告诉SaveChanges等待索引更新。您的代码看起来像这样:
试试这个:
var goon = true;
var currentEmailId = 100;
while (goon)
{
using (var session = store.OpenSession())
{
var contacts = session.Query<Contacts>()
.Where(f => f.LastEmailId < currentEmailId)
.Take(100);
if(contacts.Any())
{
foreach(var contact in contacts)
{
EmailOperation.Send(contact, currentEmailId);
contact.LastEmailId = currentEmailId;
}
// Wait for the indexes to update when calling SaveChanges.
DbSession.Advanced.WaitForIndexesAfterSaveChanges(TimeSpan.FromSeconds(30), false);
session.SaveChanges();
}
else
{
goon = false
}
}
}
如果您要一次更新多个联系人,您可以考虑使用Streaming query results结合BulkInsert来更新多个联系人群体。