还在纠结Dapper或者EF Core?不妨试试“混合ORM”--RepoDb
在.NET世界中,提到ORM,最常用的是下面2個:
Dapper,通過提供IDbConnection的擴(kuò)展方法來查詢數(shù)據(jù)庫。它的優(yōu)點在于可以輕松地執(zhí)行參數(shù)化查詢,將結(jié)果轉(zhuǎn)化為對象;非常高效,在速度方面擁有micro-ORM之王的稱號。
EF Core,微軟開源的ORM。它的優(yōu)點在于允許執(zhí)行CRUD操作而無需編寫SQL。
那有不有把2者優(yōu)點結(jié)合的ORM呢?
RepoDb
RepoDb是一個輕量級、高性能、高效的混合ORM。它提供了Dapper相似的簡單性,同時又像EF Core將一些復(fù)雜的操作進(jìn)行了封裝, 因此它被認(rèn)為是一種“混合ORM”。
RepoDb在“微”和“全”操作的使用之間切換很容易,這為開發(fā)人員在開發(fā)應(yīng)用程序時提供了靈活性。
“高性能”和“低內(nèi)存使用率”是這個庫的主要特點,你可以從下面這張圖中窺見一斑:
RepoDb支持SQL Server, SQLite, MySQL和PostgreSQL數(shù)據(jù)庫,下面就讓我們使用SQL Server數(shù)據(jù)庫來了解一下RepoDb有哪些特別之處!
基礎(chǔ)功能
首先,需要引用Nuget包RepoDb.SqlServer。
然后,在程序啟動時進(jìn)行初始化:
RepoDb.SqlServerBootstrap.Initialize();RepoDB所有功能都支持 Raw-SQL/Fluent 2種方式。
CRUD
//Raw-SQL using?(var?connection?=?new?SqlConnection(ConnectionString)) {var?user?=?connection.Query<User>("SELECT?*?FROM?[dbo].[User]?WHERE?(Id?=?@Id);",?new?{?Id?=?1?}).FirstOrDefault(); }//Fluent using?(var?connection?=?new?SqlConnection(ConnectionString)) {var?user?=?connection.Query<User>(e?=>?e.Id?==?1).FirstOrDefault(); }//Raw-SQL using?(var?connection?=?new?SqlConnection(ConnectionString)) {var?affectedRows?=?connection.ExecuteScalar<int>("UPDATE?[dbo].[User]?SET?Name?=?@Name?WHERE?Id?=?@Id;",new{Id?=?1,Name?=?"My?IO",}); }//Fluent using?(var?connection?=?new?SqlConnection(ConnectionString)) {var?user?=?new?User{Id?=?1,Name?=?"My?IO",};var?affectedRows?=?connection.Update<User>(user); }多表查詢
using?(var?connection?=?new?SqlConnection(ConnectionString)) {var?orderId?=?10045;var?tuple?=?connection.QueryMultiple<Order,?OrderItems>(order?=>?order.Id?==?orderId,?orderItem?=>?orderItem.OrderId?==?orderId);var?order?=?tuple.Item1.FirstOrDefault();var?orderItems?=?tuple.Item2.AsList();order.OrderItems?=?orderItems; }in查詢
using?(var?connection?=?new?SqlConnection(ConnectionString)) {var?names?=?new?[]?{?"wx",?"My?IO"?};var?users?=?connection.Query<user>(e?=>?names.Contains(e?=>?e.Name)); }高級功能
下面舉例幾個Dapper和EF Core默認(rèn)不支持的功能。
Merge
用于插入新行或更新表中的現(xiàn)有行。默認(rèn)使用Id作為條件,也可以用qualifiers指定條件:
var?user?=?new?User {Name?=?"My?IO",Age?=?20, }; using?(var?connection?=?new?SqlConnection(ConnectionString)) {var?id?=?connection.Merge(user,?qualifiers:?(p?=>?new?{?p.Name?})); }批量操作
如果要執(zhí)行批量操作,比如BulkDelete, BulkInsert, BulkMerge和BulkUpdate,必須先安裝Nuget包RepoDb.SqlServer.BulkOperations。
using?(var?connection?=?new?SqlConnection(connectionString)) {var?users?=?GetUsers(10000);var?insertedRows?=?connection.BulkInsert(users); }分頁
using?(var?connection?=?new?SqlConnection(connectionString)) {var?orderBy?=?OrderField.Parse(new?{?Id?=?Order.Descending?});var?page?=?0;?//?從0開始var?rowsPerBatch?=?20;?//每頁20條var?people?=?connection.BatchQuery<User>(page:?page,rowsPerBatch:?rowsPerBatch,orderBy:?orderBy,where:?e?=>?e.IsActive?==?true); }結(jié)論
篇幅有限,RepoDb的其他功能在這就不做介紹了,你可以到官網(wǎng)(https://repodb.net/)進(jìn)行詳細(xì)了解。
總體來說,使用RepoDb開發(fā)代碼更容易、更快捷。
RepoDb具有Dapper很多沒有的可立即使用的豐富功能集。使用它,必將幫助你快速交付代碼。
如果你覺得這篇文章對你有所啟發(fā),請關(guān)注我的個人公眾號”My IO“,記住我!
總結(jié)
以上是生活随笔為你收集整理的还在纠结Dapper或者EF Core?不妨试试“混合ORM”--RepoDb的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Abp Vnext Vue3 的版本实现
- 下一篇: Azure App Service 上的