Ravendb select - 更新多行
Ravendb select - update multiple row
我正在尝试 select 并从 ravendb 更新多行,但它递归地更新相同的行。即前 100 行。没有变化。
这是我的代码。我如何 select 一些行,更新每行的一些字段并一次又一次地执行直到我的工作完成。
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
}
}
}
这可能是因为您在保存更改后立即进行查询,而没有让索引在保存更改后更新。因此,您将取回相同的物品。要解决此问题,您可以告诉 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 combined with BulkInsert 来批量更新许多联系人。
我正在尝试 select 并从 ravendb 更新多行,但它递归地更新相同的行。即前 100 行。没有变化。
这是我的代码。我如何 select 一些行,更新每行的一些字段并一次又一次地执行直到我的工作完成。
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
}
}
}
这可能是因为您在保存更改后立即进行查询,而没有让索引在保存更改后更新。因此,您将取回相同的物品。要解决此问题,您可以告诉 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 combined with BulkInsert 来批量更新许多联系人。