在EntityFramework中更新或删除多个实体的建议做法是什么?
在SQL中,有时可能会写一些类似的东西
DELETE FROM table WHERE column IS NULL
要么
UPDATE table SET column1=value WHERE column2 IS NULL
或可能适用于多行的任何其他标准。
据我所知,最好的EntityFramework可以做的就像
foreach (var entity in db.Table.Where(row => row.Column == null)) db.Table.Remove(entity); // or entity.Column2 = value; db.SaveChanges();
但是当然会检索所有实体,然后为每个实体运行单独的DELETE查询。 当然,如果有许多实体满足标准,那肯定要慢得多。
因此,简而言之,EntityFramework是否支持在单个查询中更新或删除多个实体?
EF不支持批量更新或删除,但您可以这样做:
db.Database.ExecuteSqlCommand("DELETE FROM ...", someParameter);
编辑:
真正想要坚持LINQ查询的人有时会使用解决方法,他们首先从LINQ查询创建选择SQL查询:
string query = db.Table.Where(row => row.Column == null).ToString();
然后找到第一次出现的FROM
并用DELETE
替换查询的开头并用ExecuteSqlCommand
执行结果。 这种方法的问题在于它仅适用于基本场景。 它不适用于实体拆分或某些inheritance映射,您需要为每个实体删除两个或多个记录。
查看Entity Framework Extensions(多个实体更新) 。 该项目允许使用lambda表达式进行集合操作。 来自doc的样本:
this.Container.Devices.Delete(o => o.Id == 1); this.Container.Devices.Update( o => new Device() { LastOrderRequest = DateTime.Now, Description = o.Description + "teste" }, o => o.Id == 1);
挖掘EFE项目源代码,你可以看到自动化@Ladislav Mrnka第二种方法也增加了设置操作:
public override string GetDmlCommand() { //Recover Table Name StringBuilder updateCommand = new StringBuilder(); updateCommand.Append("UPDATE "); updateCommand.Append(MetadataAccessor.GetTableNameByEdmType( typeof(T).Name)); updateCommand.Append(" "); updateCommand.Append(setParser.ParseExpression()); updateCommand.Append(whereParser.ParseExpression()); return updateCommand.ToString(); }
编辑3年后
看看这个伟大的答案: https : //stackoverflow.com/a/12751429
entity framework扩展库有助于实现此目的。
删除
//delete all users where FirstName matches context.Users.Delete(u => u.FirstName == "firstname");
更新
//update all tasks with status of 1 to status of 2 context.Tasks.Update( t => t.StatusId == 1, t2 => new Task {StatusId = 2}); //example of using an IQueryable as the filter for the update var users = context.Users.Where(u => u.FirstName == "firstname"); context.Users.Update(users, u => new User {FirstName = "newfirstname"});
- DataContractJsonSerializer可以处理循环引用吗?
- 运行`serviceProvider.GetService ();`时,.Net core 2.0控制台程序得到空值。
- 在另一个线程中运行异步函数
- 为什么在将LINite Nuget Package添加到LINQPad时会出现DllNotFoundException?
- 从json反序列化可以将单个T对象或T数组转换为List
- 什么算法.Net用于搜索字符串中的模式?
- NetworkStream不支持搜索操作
- UWP应用程序:无法加载文件或程序集’System.Runtime.WindowsRuntime,Version = 4.0.14.0
- 什么时候可以使用XML文件来保存信息?