日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EF Core中高效批量删除、更新数据的Zack.EFCore.Batch发布三个新特性

發布時間:2023/12/4 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EF Core中高效批量删除、更新数据的Zack.EFCore.Batch发布三个新特性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Zack.EFCore.Batch是一個支持在Entity Framework Core中高效刪除和更新數據的開源庫。我們知道,EF Core中不支持高效的刪除和更新數據,所有的更新和操作都是逐條數據處理。比如,如果使用如下的語句刪除實現“刪除所有價格大于10元的書“:

ctx.RemoveRange(ctx.Books.Where(b=> b.Price > 33))

那么,EntityFramework Core會先執行Select * from books where price>33,然后再對于每一條數據執行delete from books where id=@id進行刪除。EF Core中批量數據的更新原理也是類似。因此在EF Core中進行大量數據的批量刪除、更新效率是比較低的。

為了能夠實現 “一句SQL實現數據的刪除、更新“,我開發了開源項目Zack.EFCore.Batch,這個開源項目實現了如下批量刪除的寫法:

await ctx.DeleteRangeAsync<Book>(b => b.Price > n || b.AuthorName =="zack yang");

?上面的C#代碼就會執行如下的SQL語句,從而實現“一句SQL刪除數據“的效果:

Delete FROM[T_Books] WHERE ([Price] > @__p_0) OR ([AuthorName] = @__s_1)

? 這個開源項目使用EF Core實現SQL語句的翻譯,因此只要EF Core支持的數據庫,對應的Linq操作都可以實現翻譯成對應的方言SQL,比如下面的批量更新操作的Linq代碼:

await ctx.BatchUpdate<Book>().Set(b => b.Price, b => b.Price + 3).Set(b => b.Title, b => s).Set(b =>b.AuthorName,b=>b.Title.Substring(3,2)+b.AuthorName.ToUpper()).Set(b => b.PubTime, b => DateTime.Now).Where(b => b.Id > n || b.AuthorName.StartsWith("Zack")) .ExecuteAsync();

?在SQL Server數據庫下就會翻譯成一條Update語句,如下:

Update [T_Books]SET [Price] = [Price] + 3.0E0, [Title] = @__s_1, [AuthorName] =COALESCE(SUBSTRING([Title], 3 + 1, 2), N'') + COALESCE(UPPER([AuthorName]),N''), [PubTime] = GETDATE() WHERE ([Id] >@__p_0) OR ([AuthorName] IS NOT NULL AND ([AuthorName] LIKE N'Zack%'))

?經歷用戶幾個月的使用和反饋issue,目前項目已經升級到1.4.3版,支持SQLServer、MySQL、PostgreSQL、Oracle、SQLite數據庫。理論上來講,只要EF Core支持的數據庫,Zack.EFCore.Batch都可以支持。如果您有其他數據庫需要支持,請和我聯系。

除了已有的特性之外,Zack.EFCore.Batch新版增加了如下特性。

?

特性一、基于實體關系的數據過濾

? ? 在過濾條件中支持實體之間的關系。例如:

ctx. DeleteRangeAsync<Article>(a=>a.Comments.Any(c=>c.Message.Contains(“History”)) ||a.Author.BirthDay.Year<2000);

?特性二、支持數據的批量插入

可以用如下的方式進行高效的批量插入:

List<Book> books = new List<Book>(); for (int i = 0; i < 100; i++) {books.Add(newBook { AuthorName = "abc" + i, Price = new Random().NextDouble(),PubTime = DateTime.Now, Title = Guid.NewGuid().ToString() }); } using (TestDbContext ctx = newTestDbContext()) {ctx.BulkInsert(books); }

?????? BulkInsert()底層使用各個數據庫的BulkCopy機制實現數據插入,因此插入效率非常高。目前有如下兩個缺點:不支持關聯數據的自動插入,對于關聯的對象,請同樣調用BulkInsert()進行插入;由于PostgreSQL的.NET Core Provider還沒有支持BulkCopy,所以目前Zack.EFCore.Batch暫不支持PostgreSQL,我后面再去想辦法解決。

?

特征三、支持Take()、Skip()來限制刪除和更新數據的范圍

?????? 批量刪除和批量更新都支持通過Take()、Skip()來實現部分刪除和部分更新,例子代碼如下:

await ctx.Comments.Where(c =>c.Article.Id == id).Skip(3) .DeleteRangeAsync<Comment>(ctx); await ctx.Comments.Where(c =>c.Article.Id == id).Skip(3).Take(10) .DeleteRangeAsync<Comment>(ctx); await ctx.Comments.Where(c =>c.Article.Id == id).Take(10) .DeleteRangeAsync<Comment>(ctx);awaitctx.BatchUpdate<Comment>().Set(c => c.Message, c => c.Message +"abc").Where(c=> c.Article.Id == id).Skip(3).ExecuteAsync();await ctx.BatchUpdate<Comment>().Set(c=> c.Message, c => c.Message + "abc").Where(c=> c.Article.Id == id).Skip(3).Take(10).ExecuteAsync(); awaitctx.BatchUpdate<Comment>().Set(c => c.Message, c => c.Message +"abc").Where(c => c.Article.Id == id).Take(10).ExecuteAsync();

?

具體用法請訪問開源項目地址:

https://github.com/yangzhongke/Zack.EFCore.Batch

NuGet地址:https://www.nuget.org/packages/Zack.EFCore.Batch/

總結

以上是生活随笔為你收集整理的EF Core中高效批量删除、更新数据的Zack.EFCore.Batch发布三个新特性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。