使用LINQ更新记录

时间:2013-12-30 02:55:48

标签: c# linq entity-framework

我需要在表中为行子集设置一个值。在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);

9 个答案:

答案 0 :(得分:50)

我认为person_idPerson表的主键,所以这里是更新单个记录的方法:

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();

答案 1 :(得分:48)

这效果最佳。

(from p in Context.person_account_portfolio 
 where p.person_id == personId select p).ToList()
                                        .ForEach(x => x.is_default = false);

Context.SaveChanges();

答案 2 :(得分:9)

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

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

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

答案 3 :(得分:6)

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

  1. 执行查询,对其进行迭代以修改实体,然后调用SaveChanges()
  2. 执行您在问题顶部提到的SQL命令。要了解如何执行此操作,请查看this page
  3. 如果使用选项2,则会丢失实体框架为您提供的一些抽象,但如果您需要执行非常大的更新,这可能是出于性能原因的最佳选择。

答案 4 :(得分:3)

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

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

  

查询所在的use of yield has an interesting benefit   实际上没有评估,直到它被迭代,或者用a   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
}  

我希望它有所帮助...

答案 5 :(得分:2)

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

答案 6 :(得分:1)

奇怪的是,对我而言,它是SubmitChanges而不是SaveChanges:

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

答案 7 :(得分:0)

为了回应上面对答案的评论,这是我的解决方案,它使用了一个没有中断或抽象的 Linq 查询,但它避免了不必要地使用列表和 ForEach 的内存和计算......< /p>

(from p in Context.person_account_portfolio 
                 where p.personId == personId 
                 select p).FirstOrDefault().is_default .Equals(false);

答案 8 :(得分:-1)

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>