多行更新而不选择

时间:2012-05-07 18:35:51

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

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

我想执行执行此操作的查询:

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

我想用Entity Framework 4.3.1。

这只是一个例子,我有大量的记录,我只想要1列来改变价值,没有别的。使用Where(...)加载到DbContext。选择(...),更改所有元素,然后使用SaveChanges()保存对我来说效果不佳。

我应该坚持使用ExecuteCommand并发送如上所述的直接查询(当然可以重复使用),还是有另一种很好的方法可以从Linq 2 Entities / Fluent中完成。

谢谢!

5 个答案:

答案 0 :(得分:1)

您所描述的内容实际上并不适用于Entity Framework。你有几个选择,

  1. 您可以将其编写为字符串并通过EF .ExecuteSqlCommand执行(在上下文中)
  2. 您可以使用类似Entity Framework Extended的内容(但是从我看到的内容并没有很好的表现)

答案 1 :(得分:0)

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

using (var context = new DBContext())
{
    context.YourEntitySet.Attach(yourExistingEntity);

    // Update fields

    context.SaveChanges();
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

是的,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);
    }