Ravendb选择 - 更新多行

时间:2017-07-13 01:21:49

标签: ravendb

我正在尝试从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
           }
     }
}

1 个答案:

答案 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来更新多个联系人群体。