使用 LINQ 更新记录

问题描述 投票:0回答:8

我需要在表中为行子集设置一个值。在 SQL 中,我会这样做:

UPDATE dbo.Person SET is_default = 0 WHERE person_id = 5

有没有办法在 LINQ 中做到这一点?

我目前使用的是:

var result = (from p in Context.People....)

符号。

有我可以使用的更新方法吗?或者我是否必须获取所有记录,然后在 Foreach 中逐一更新它们?

如果可能的话,这是最有效的方法吗?

(from p in Context.person_account_portfolio where p.person_id == personId select p)
   .ToList()
   .ForEach(
       x =>
       x.is_default =
       false);
c# linq entity-framework
8个回答
77
投票

这个效果最好。

(from p in Context.person_account_portfolio 
 where p.person_id == personId
 select p)
 .ToList() // This allows use of list methods
 .ForEach(x => x.is_default = false); // Cycle through each item from query/in list and update its property 'is_default' with value 'false'

Context.SaveChanges();

73
投票

我假设

person_id
Person
表的主键,所以以下是更新单个记录的方法:

Person result = (from p in Context.Persons
              where p.person_id == 5
              select p).SingleOrDefault();

result.is_default = false;

Context.SaveChanges();

以下是更新多条记录的方法:

List<Person> results = (from p in Context.Persons
                        where .... // add where condition here
                        select p).ToList();

foreach (Person p in results)
{
    p.is_default = false;
}

Context.SaveChanges();

17
投票

作为对已接受答案的补充,您可能会发现使用 LINQ 方法语法时代码看起来更加一致:

Context.person_account_portfolio
.Where(p => person_id == personId)
.ToList()
.ForEach(x => x.is_default = false);

.ToList()
是必需的,因为 .ForEach() 仅在
List<T>
上定义,而不是在
IEnumerable<T>
上定义。请注意,
.ToList()
将在执行循环之前执行查询并从数据库加载所有匹配的行。


7
投票

据我所知,你有两个选择:

  1. 执行查询,迭代查询以修改实体,然后调用
    SaveChanges()
  2. 执行您在问题顶部提到的 SQL 命令。要了解如何执行此操作,请查看此页面

如果您使用选项 2,您将失去实体框架为您提供的一些抽象,但如果您需要执行非常大的更新,出于性能原因,这可能是最佳选择。


3
投票

是的。可以使用foreach来更新linq中的记录。没有性能下降。

您可以验证标准 Where 运算符是使用 C# 2.0 中引入的 yield 构造实现的。

yield 的使用有一个有趣的好处,即查询是 在迭代之前不会实际评估,或者使用 foreach 语句或手动使用底层 GetEnumerator 和 MoveNext 方法

例如,

var query = db.Customers.Where (c => c.Name.StartsWith ("A")); query = query.Where (c => c.Purchases.Count() >= 2); var result = query.Select (c => c.Name); foreach (string name in result) // Only now is the query executed! Console.WriteLine (name);

例外运算符有:首先,ElementAt、Sum、Average、All、Any、ToArray 和 ToList 强制立即查询评估。

因此无需害怕使用

foreach

 来获得 
update
 linq 结果。

在您的情况下,下面给出的代码示例对于更新许多属性很有用,

var persons = (from p in Context.person_account_portfolio where p.person_name == personName select p); //TO update using foreach foreach(var person in persons) { //update property values }

希望对您有帮助...


1
投票
是的,您必须获取所有记录,更新它们,然后致电

SaveChanges


1
投票
奇怪的是,对我来说它是 SubmitChanges 而不是 SaveChanges:

foreach (var item in w) { if (Convert.ToInt32(e.CommandArgument) == item.ID) { item.Sort = 1; } else { item.Sort = null; } db.SubmitChanges(); }
    

0
投票
public ActionResult OrderDel(int id) { string a = Session["UserSession"].ToString(); var s = (from test in ob.Order_Details where test.Email_ID_Fk == a && test.Order_ID == id select test).FirstOrDefault(); s.Status = "Order Cancel By User"; ob.SaveChanges(); //foreach(var updter in s) //{ // updter.Status = "Order Cancel By User"; //} return Json("Sucess", JsonRequestBehavior.AllowGet); } <script> function Cancel(id) { if (confirm("Are your sure ? Want to Cancel?")) { $.ajax({ type: 'POST', url: '@Url.Action("OrderDel", "Home")/' + id, datatype: 'JSON', success: function (Result) { if (Result == "Sucess") { alert("Your Order has been Canceled.."); window.location.reload(); } }, error: function (Msgerror) { alert(Msgerror.responseText); } }) } } </script>
    
© www.soinside.com 2019 - 2024. All rights reserved.