【问题标题】:Multiple rows update without select多行更新而不选择
【发布时间】:2017-07-07 19:48:18
【问题描述】:

Linq 2 实体的一个老问题。我只是再问一遍,以防有人提出解决方案。

我想执行这样的查询:

UPDATE dbo.Products WHERE Category = 1 SET Category = 5

我想用 Entity Framework 4.3.1 来做。

这只是一个例子,我有很多记录,我只想要 1 列来更改值,仅此而已。使用 Where(...).Select(...) 加载到 DbContext,更改所有元素,然后使用 SaveChanges() 保存对我来说效果不佳。

我应该坚持使用 ExecuteCommand 并发送上面写的直接查询(当然要使其可重用)还是有另一种不错的方法可以从 Linq 2 Entities / Fluent 做到这一点。

谢谢!

【问题讨论】:

  • 你能描述一下究竟什么对你不起作用或者它是如何不起作用的吗?也许您尝试过的示例代码以及它是如何失败的?
  • 没有什么是“失败的”。这是一个关于性能的问题,我不确定 EF 是否可行。我要求确认我是否正确,或者我错过了什么:)

标签: linq entity-framework entity-framework-4 linq-to-entities


【解决方案1】:

您所描述的内容实际上不适用于实体框架。你有几个选择,

  1. 您可以将其编写为字符串并通过 EF 使用 .ExecuteSqlCommand(在上下文中)执行它
  2. 您可以使用 Entity Framework Extended 之类的东西(但据我所知,这并没有很好的性能)

【讨论】:

    【解决方案2】:

    您可以更新实体而无需先从数据库中获取它,如下所示

    using (var context = new DBContext())
    {
        context.YourEntitySet.Attach(yourExistingEntity);
    
        // Update fields
    
        context.SaveChanges();
    }
    

    【讨论】:

    • 对不起,这不是您问题的解决方案,我没有很好地理解问题
    【解决方案3】:

    如果您有基于集合的操作,那么 SQL 比 EF 更适合。

    所以,是的 - 在这种情况下,您应该坚持使用 ExecuteCommand

    【讨论】:

      【解决方案4】:

      我不知道这是否适合您,但您可以尝试创建一个执行更新的存储过程,然后将该过程作为函数导入添加到您的模型中。然后您可以在单个数据库调用中执行更新:

      using(var dc = new YourDataContext())
      {
          dc.UpdateProductsCategory(1, 5);
      }
      

      其中UpdateProductsCategory 是导入的存储过程的名称。

      【讨论】:

        【解决方案5】:

        是的,ExecuteCommand() 绝对是一种无需获取所有行的数据并让 ChangeTracker 对其进行排序的方法。举个例子:

        将导致所有行都被获取并为每行更改执行更新:

            using (YourDBContext yourDB = new YourDBContext()) {
                yourDB.Products.Where(p => p.Category = 1).ToList().ForEach(p => p.Category = 5);
                yourDB.SaveChanges();
            }
        

        只有一次更新:

            using (YourDBContext yourDB = new YourDBContext()) {
                var sql = "UPDATE dbo.Products WHERE Category = @oldcategory SET Category = @newcategory";
                var oldcp = new SqlParameter { ParameterName = "oldcategory", DbType = DbType.Int32, Value = 1 };
                var newcp = new SqlParameter { ParameterName = "newcategory", DbType = DbType.Int32, Value = 5 };
                yourDB.Database.ExecuteSqlCommand(sql, oldcp, newcp);
            }
        

        【讨论】:

          猜你喜欢
          • 2018-06-21
          • 1970-01-01
          • 2013-07-29
          • 1970-01-01
          • 1970-01-01
          • 2012-06-30
          • 1970-01-01
          • 2023-03-26
          • 1970-01-01
          相关资源
          最近更新 更多