NET问答: Entity Framework 如何快速高效的删除表中所有记录 ?
咨詢區(qū)
Zhenia:
在 Entity Framework 中,如何快速高效的刪除表中的所有行?
我目前是這樣寫的。
var?rows?=?from?o?in?dataDb.Tableselect?o; foreach?(var?row?in?rows) {dataDb.Table.Remove(row); }dataDb.SaveChanges();但這種做法,測試下來太耗費時間了,請問有什么更高效的做法嗎?
回答區(qū)
Ahmed Alejo:
警告:下面的做法僅適合那些小表操作 (?<1000)
這里我采用的是通過 EF 去刪除表記錄,而不是直接使用 sql,所以此種刪除方式適合所有 EF 支持的 ?RDBM ,聲明一下,如果你的表數(shù)據(jù)很小,或者你不在乎性能,可以簡單如下調(diào)用。
VotingContext.Votes.RemoveRange(VotingContext.Votes);為了讓代碼更干凈簡潔,可以專門定義一個 擴展方法。
public?static?class?EntityExtensions {public?static?void?Clear<T>(this?DbSet<T>?dbSet)?where?T?:?class{dbSet.RemoveRange(dbSet);} }接下來代碼意圖就明顯了。
VotingContext.Votes.Clear(); VotingContext.Voters.Clear(); VotingContext.Candidacy.Clear(); VotingContext.Polls.Clear(); await?VotingTestContext.SaveChangesAsync();Rudi Visser:
最快的方式當然是使用 SQL 的 TRUNCATE TABLE,它是直接針對表操作而不是單獨的行。
dataDb.ExecuteStoreCommand("TRUNCATE?TABLE?[Table]");如果你用的是 EFCore 3.1,可以使用下面的語句清空所有行。
context.Database.ExecuteSqlRaw("TRUNCATE?TABLE?[TableName]");點評區(qū)
其實這是在 EF 操作中經(jīng)常會遇到的一個問題,通常的做法也就上面這兩種。
想更加通用,不考慮性能,采用 EF 直接操作,生成的 sql 大概如下。
監(jiān)控到 sql:
Opened?connection?at?2021/4/5?22:09:12?+08:00SELECT[Extent1].[ID]?AS?[ID],[Extent1].[ColorName]?AS?[ColorName],[Extent1].[ColorCode]?AS?[ColorCode],[Extent1].[IsDelete]?AS?[IsDelete]FROM?[dbo].[Color]?AS?[Extent1]--?Executing?at?2021/4/5?22:09:12?+08:00--?Completed?in?5?ms?with?result:?SqlDataReaderClosed?connection?at?2021/4/5?22:09:12?+08:00Opened?connection?at?2021/4/5?22:09:12?+08:00Started?transaction?at?2021/4/5?22:09:12?+08:00DELETE?[dbo].[Color] WHERE?([ID]?=?@0)--?@0:?'1'?(Type?=?Int32)--?Executing?at?2021/4/5?22:09:12?+08:00--?Completed?in?1?ms?with?result:?1DELETE?[dbo].[Color] WHERE?([ID]?=?@0)--?@0:?'2'?(Type?=?Int32)--?Executing?at?2021/4/5?22:09:12?+08:00--?Completed?in?0?ms?with?result:?1DELETE?[dbo].[Color] WHERE?([ID]?=?@0)--?@0:?'3'?(Type?=?Int32)--?Executing?at?2021/4/5?22:09:12?+08:00--?Completed?in?0?ms?with?result:?1Committed?transaction?at?2021/4/5?22:09:12?+08:00Closed?connection?at?2021/4/5?22:09:12?+08:00從輸出信息看,清空操作采用的是將所有的sql拼在一個 Transaction 內(nèi),性能有所提升,不過確實只適合一些小表????????????
想要定制化,性能優(yōu)先,直接使用 sql
原文鏈接:https://stackoverflow.com/questions/15220411/entity-framework-delete-all-rows-in-table
總結(jié)
以上是生活随笔為你收集整理的NET问答: Entity Framework 如何快速高效的删除表中所有记录 ?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Asp.Net Core 5 REST
- 下一篇: 轻量NuGet服务—BaGet