在.NET世界中,提到ORM,最常用的是下面2个:
Dapper,通过提供IDbConnection的扩展方法来查询数据库。它的优点在于可以轻松地执行参数化查询,将结果转化为对象;非常高效,在速度方面拥有micro-ORM之王的称号。
EF Core,微软开源的ORM。它的优点在于允许执行CRUD操作而无需编写SQL。
那有不有把2者优点结合的ORM呢?
RepoDb
RepoDb是一个轻量级、高性能、高效的混合ORM。它提供了Dapper相似的简单性,同时又像EF Core将一些复杂的操作进行了封装, 因此它被认为是一种“混合ORM”。
RepoDb在“微”和“全”操作的使用之间切换很容易,这为开发人员在开发应用程序时提供了灵活性。
“高性能”和“低内存使用率”是这个库的主要特点,你可以从下面这张图中窥见一斑:
RepoDb支持SQL Server, SQLite, MySQL和PostgreSQL数据库,下面就让我们使用SQL Server数据库来了解一下RepoDb有哪些特别之处!
基础功能
首先,需要引用Nuget包RepoDb.SqlServer
。
然后,在程序启动时进行初始化:
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默认不支持的功能。
Merge
用于插入新行或更新表中的现有行。默认使用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 }));
}
批量操作
如果要执行批量操作,比如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);
}
结论
篇幅有限,RepoDb的其他功能在这就不做介绍了,你可以到官网(https://repodb.net/)进行详细了解。
总体来说,使用RepoDb开发代码更容易、更快捷。
RepoDb具有Dapper很多没有的可立即使用的丰富功能集。使用它,必将帮助你快速交付代码。
如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!