【问题标题】:Update using LINQ to SQL使用 LINQ to SQL 更新
【发布时间】:2009-05-26 10:18:32
【问题描述】:

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

【问题讨论】:

    标签: linq linq-to-sql


    【解决方案1】:

    LINQ 是一个查询工具 (Q = Query) - 因此没有神奇的 LINQ 方法可以只更新单行,除非通过(面向对象的)数据上下文(在 LINQ-to-SQL 的情况下) .要更新数据,您需要将其取出、更新记录并提交更改:

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

    或者写一个在TSQL中做同样事情的SP,通过data-context暴露SP:

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

    【讨论】:

    • @Mathieu - 你建议它猜测 200 个属性的值吗?他们需要来自某个地方......
    • 抱歉,我的想法没有在此处显示,我的错。
    【解决方案2】:

    在没有更详细信息的情况下:

    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
    • 这对我有用,而最佳答案(当前)没有。 +1,因为这是一个更简单的编码易于理解/修改的示例
    【解决方案3】:
    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
    

    【讨论】:

      【解决方案4】:
       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();
      

      【讨论】:

        【解决方案5】:

        我在一周前找到了解决方法。您可以使用带有“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} --> 是您将发送过滤器值的字段;

        代码 --> 是该字段的新值;

        我希望这个参考资料有所帮助。

        【讨论】:

        • 为什么要使用ExecuteCommand来更新!!?当您可以简单地更新对象并调用 SubmitChanges 时,这样做似乎有点奇怪。
        猜你喜欢
        • 1970-01-01
        • 2012-10-26
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        • 2011-03-02
        • 1970-01-01
        相关资源
        最近更新 更多