3

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 中做到这一点。

谢谢!

4

5 回答 5

1

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

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

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

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

于 2012-05-07T20:08:56.987 回答
0

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

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

    // Update fields

    context.SaveChanges();
}
于 2012-05-07T20:03:50.997 回答
0

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

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

whereUpdateProductsCategory将是导入的存储过程的名称。

于 2012-05-08T10:31:24.060 回答
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);
    }
于 2017-07-07T11:48:18.073 回答