使用LINQ to SQL进行更新

44

如何在LINQ to SQL中根据特定的ID更新记录?

5个回答

56

LINQ是一个查询工具(Q = Query) - 因此除了通过(面向对象的)数据上下文(在LINQ-to-SQL的情况下)来更新单个行之外,没有任何神奇的LINQ方式。 要更新数据,您需要获取它,更新记录并提交更改:

using(var ctx = new FooContext()) {
    var obj = ctx.Bars.Single(x=>x.Id == id);
    obj.SomeProp = 123;
    ctx.SubmitChanges();
}

或者编写一个 TSQL 存储过程实现相同的功能,并通过数据上下文公开该存储过程:

using(var ctx = new FooContext()) {
    ctx.UpdateBar(id, 123);
}

@Mathieu - 你是建议它猜测200个属性的值吗?它们需要来自某个地方... - Marc Gravell
抱歉,我有些想法没有在这里展示出来,我的错。 - Mathieu

5
在没有更详细的信息的情况下:
using(var dbContext = new dbDataContext())
{
    var data = dbContext.SomeTable.SingleOrDefault(row => row.id == requiredId);
    if(data != null)
    {
        data.SomeField = newValue;
    }
    dbContext.SubmitChanges();
}

那个无法编译;Where(pred)将返回一个IQueryable<SomeType>,而不是SomeType。 - Marc Gravell
这对我很有用,而目前排名最高的答案却没有。点赞因为这是一个更简单编写、易于理解/修改的示例。 - Brad

2
AdventureWorksDataContext db = new AdventureWorksDataContext();
db.Log = Console.Out;

// Get hte first customer record
Customer c = from cust in db.Customers select cust where id = 5;
Console.WriteLine(c.CustomerType);
c.CustomerType = 'I';
db.SubmitChanges(); // Save the changes away

2
 DataClassesDataContext dc = new DataClassesDataContext();

 FamilyDetail fd = dc.FamilyDetails.Single(p => p.UserId == 1);

 fd.FatherName=txtFatherName.Text;
        fd.FatherMobile=txtMobile.Text;
        fd.FatherOccupation=txtFatherOccu.Text;
        fd.MotherName=txtMotherName.Text;
        fd.MotherOccupation=txtMotherOccu.Text;
        fd.Phone=txtPhoneNo.Text;
        fd.Address=txtAddress.Text;
        fd.GuardianName=txtGardianName.Text;

        dc.SubmitChanges();

0

我在一周前找到了一个解决方法。您可以使用"ExecuteCommand"直接命令:

MDataContext dc = new MDataContext();
var flag = (from f in dc.Flags
                   where f.Code == Code
                   select f).First();
_refresh = Convert.ToBoolean(flagRefresh.Value);
if (_refresh)
{
    dc.ExecuteCommand("update Flags set value = 0 where code = {0}", Code);
}

ExecuteCommand语句中,您可以直接发送查询,以及要更新的特定记录的值。

value = 0 --> 0是记录的新值;

code = {0} --> 是您将发送过滤器值的字段;

Code --> 是字段的新值;

我希望这个参考能够帮到您。

2
为什么要使用ExecuteCommand来更新!? 当您可以简单地更新对象并调用SubmitChanges时,这似乎有点奇怪。 - DazManCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接