gpt4 book ai didi

c# - 如何在不获取对象、更改对象和调用 SaveChanges 的情况下在 LINQ 中编写更新?

转载 作者:行者123 更新时间:2023-11-30 15:21:30 27 4
gpt4 key购买 nike

我正在寻找等同于以下内容的 LINQ 查询:

UPDATE Person p SET p.Age = p.Age + 1 WHERE p.Id = 123

我知道一个解决方案是选择该行然后像这样更新它:

var p = db.Set<Person>.Where(p => p.Id==123);
p.Age = p.Age + 1;
db.SaveChanges();

但这不是一种安全的方法,因为在提交更改之前,有人可能会增加 Age 的值,而我们会用错误的值覆盖该值。

问题:是否有一个 LINQ 查询能够被转换成这样的更新查询:

UPDATE Person p SET p.Age = p.Age + 1 WHERE p.Id = 123

最佳答案

据我所知,在默认的 Entity Framework 中,您不能使用 LINQ 来做到这一点,因此您有以下选择:

  1. 在这种情况下,只需使用原始 sql 查询,而无需考虑 LINQ 和 Entity Framework。
  2. 尝试使用EntityFramework.Extended图书馆。它有 Update 扩展方法,所以在你的情况下是:

    db.Set<Person>.Where(p => p.Id==123).Update(p => new Person {Age = p.Age + 1});

    这个库所做的是解析你的表达式树并构造原始更新 sql 查询到你的数据库。对于简单的情况,它应该可以正常工作(尽管它生成的 sql 当然不如您自己编写的那么干净,但对于 EF 本身也是如此)。

关于c# - 如何在不获取对象、更改对象和调用 SaveChanges 的情况下在 LINQ 中编写更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37514899/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com