【问题标题】:EF - Update multiple rows in database without using foreach loopEF - 在不使用 foreach 循环的情况下更新数据库中的多行
【发布时间】:2015-12-05 16:35:09
【问题描述】:

我的测试代码:

using (var db = new MyDbContext())
{
  string fromUser = ""; //sender
  string toUser = ""; //receiver

  var messages = db.Message.Where(x => x.FromUser == fromUser && x.ToUser == toUser)
                 .ToList();

  foreach (var message in messages)
  {
    message.IsRead = true;
    db.SaveChanges();
  }
}

我的问题:在这种情况下,是否有另一种方法可以在不使用foreach 循环的情况下更新数据库?

p/s:我一直在参考这些问题,但它们都没有解决我的问题:

【问题讨论】:

  • SaveChanges() 移出for 循环

标签: c# entity-framework linq


【解决方案1】:

您不需要在每次迭代时保存更改()。这将多次访问数据库。试试:

using (var db = new MyDbContext())
{
  string fromUser = ""; //sender
  string toUser = ""; //receiver
  var messages = db.Message.Where(x => x.FromUser == fromUser && x.ToUser == toUser)
                 .ToList();
  messages.ForEach(m => m.IsRead = true);
  db.SaveChanges();
}

【讨论】:

  • 创建一个列表和 lambda 只是为了调用一个内部是循环的方法。疯狂的人。
  • 嗯,更大的一点当然是单个数据库调用。有些人会争辩说 lambda 看起来更干净(这是一个更清晰的推荐重构)。疯狂是有点苛刻的 IMO。
  • @SteveGreene 该评论不适用于您或您的解决方案,我知道这是 OP 请求。确实,单个数据库调用是重点,但不是来自帖子标题,这会将注意力转移到不重要的事情上。 List<T>.ForEach 是个错误 - blogs.msdn.com/b/ericlippert/archive/2009/05/18/…
  • Simple and Direct 接近并节省了大量的处理时间。谢谢
【解决方案2】:

只是为了更新史蒂夫的答案,在较新的 EF(当前 EF Core 3.1.3)中,您可以将所有内容作为一个语句来完成。

await db.Message.Where(m => m.FromUser == fromUser && m.ToUser == toUser).ForEachAsync(m => m.IsRead = true);
await db.SaveChangesAsync().ConfigureAwait(false);

【讨论】:

    猜你喜欢
    • 2013-09-20
    • 2018-12-06
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    相关资源
    最近更新 更多