all*_*ded 75 c# sql asp.net-mvc entity-framework
我正在尝试为实体框架创建一个查询,这将允许我获取ID列表并更新与它们关联的字段.
SQL中的示例:
UPDATE Friends
SET msgSentBy = '1234'
WHERE id IN (1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)
如何将上述转换为实体框架?
Dam*_*ith 136
类似下面的东西
var idList=new int[]{1, 2, 3, 4};
using (var db=new SomeDatabaseContext())
{
var friends= db.Friends.Where(f=>idList.Contains(f.ID)).ToList();
friends.ForEach(a=>a.msgSentBy='1234');
db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
您可以更新多个字段,如下所示
friends.ForEach(a =>
{
a.property1 = value1;
a.property2 = value2;
});
Run Code Online (Sandbox Code Playgroud)
San*_*han 18
使用 Entity Framework 7 进行大规模更新的最佳方法如下:
var idList = new int[]{1, 2, 3, 4};
context.Friends
.Where(f => idList.Contains(f.ID))
.ExecuteUpdate(f => f.SetProperty(x => x.Name, x => $"Updated {x.Name}"));
Run Code Online (Sandbox Code Playgroud)
这样做的优点是它不会检索所有记录。它只是发送更新查询。
参考:ExecuteUpdate 和 ExecuteDelete(批量更新)
小智 5
IQueryable.ToQueryString如果您愿意在代码中出现一些原始 SQL,则 Entity Framework Core 5.0 中引入的方法可能会对这种情况有所帮助。此方法将生成可包含在原始 SQL 查询中的 SQL,以对该查询标识的记录执行批量更新。
例如:
using var context = new DbContext();
var ids = new List<int>() { 1, 2, 3, 4 };
var query = context.Friends.Where(_ => ids.Contains(_.id)).Select(_ => _.id);
var sql = $"UPDATE Friends SET msgSentBy = {{0}} WHERE id IN ({query.ToQueryString()})";
context.Database.ExecuteSqlRaw(sql, "1234");
Run Code Online (Sandbox Code Playgroud)
这种方法的主要缺点是使用原始 SQL。但是,我不知道有任何合理的方法可以使用当前的 Entity Framework Core 功能来避免这种情况 - 您会遇到此警告,或此处发布的其他答案的警告,例如:
DbContext.SaveChanges()它将一次更新一条记录,而不是进行批量更新。如果将来解决以下问题,那么我们可能会在这里得到更好的答案:批量(即基于集合的)CUD 操作(无需将数据加载到内存中)#795