当前位置: 首页 > 编程语言 > C#

在EntityFramework中更新或删除多个实体的推荐做法是什么?分享

时间:2023-04-10 18:07:38 C#

在EntityFramework中更新或删除多个实体的推荐做法是什么?在SQL中,有时可能会写类似DELETEFROMtableWHEREcolumnISNULL或UPDATEtableSETcolumn1=valueWHEREcolumn2ISNULL或任何其他可能适用于多行的条件。据我所知,最好的EntityFramework可以做的是foreach(varentityindb.Table.Where(row=>row.Column==null))db.Table.Remove(entity);//或实体。列2=值;db.SaveChanges();但当然会检索所有实体,然后为每个实体运行单独的DELETE查询。当然,如果符合条件的实体比较多,肯定会慢很多。那么,简而言之,EntityFramework是否支持在单个查询中更新或删除多个实体?EF不支持批量更新或删除,但您可以这样做:db.Database.ExecuteSqlCommand("DELETEFROM...",someParameter);编辑:真正想坚持使用LINQ查询的人有时会使用变通方法,他们首先从LINQ查询开始创建选择SQL查询:stringquery=db.Table.Where(row=>row.Column==null).ToString();然后找到第一次出现的FROM并将查询的开头替换为DELETE并使用ExecuteSqlCommand执行结果。这种方法的问题在于它仅适用于基本场景。它不适用于实体拆分或某些继承映射,您需要为每个实体删除两个或更多记录。查看实体框架扩展(多个实体更新)。该项目允许使用lambda表达式进行集合操作。来自文档的示例:this.Container.Devices.Delete(o=>o.Id==1);this.Container.Devices.Update(o=>newDevice(){LastOrderRequest=DateTime.Now,Description=o.Description+"teste"},o=>o.Id==1);深挖EFE项目源码,可以看到自动化@LadislavMrnka第二种方法也添加了set操作:publicoverridestringGetDmlCommand(){//恢复表名StringBuilderupdateCommand=newStringBuilder();updateCommand.Append("更新");updateCommand.Append(MetadataAccessor.GetTableNameByEdmType(typeof(T).Name));updateCommand.Append("");updateCommand.Append(setParser.ParseExpression());updateCommand.Append(whereParser.ParseExpression());返回updateCommand.ToString();}编辑3年后查看这个很好的答案:https://stackoverflow.com/a/12751429entityframework一个扩展库可以帮助解决这个问题。delete//删除FirstName匹配的所有用户context.Users.Delete(u=>u.FirstName=="firstname");update//将状态为1的所有任务更新为状态2context.Tasks.Update(t=>t.StatusId==1,t2=>newTask{StatusId=2});//使用IQueryable作为更新过滤器的示例varusers=context.Users.Where(u=>u.FirstName=="firstname");context.Users.Update(users,u=>newUser{FirstName="newfirstname"});https://github.com/loresoft/EntityFramework.Extended以上是C#学习教程:在EntityFramework中更新或者删除多个实体的推荐做法是什么?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: