0
点赞
收藏
分享

微信扫一扫

还在纠结Dapper或者EF Core?不妨试试“混合ORM”--RepoDb

RJ_Hwang 2022-03-12 阅读 31

在.NET世界中,提到ORM,最常用的是下面2个:


  • Dapper​,通过提供IDbConnection的扩展方法来查询数据库。它的优点在于可以轻松地执行参数化查询,将结果转化为对象;非常高效,在速度方面拥有micro-ORM之王的称号。
  • EF Core​,微软开源的ORM。它的优点在于允许执行CRUD操作而无需编写SQL。

那有不有把2者优点结合的ORM呢?

RepoDb

RepoDb是一个轻量级、高性能、高效的混合ORM。它提供了Dapper相似的简单性,同时又像EF Core将一些复杂的操作进行了封装, 因此它被认为是一种“混合ORM”。

RepoDb在“微”和“全”操作的使用之间切换很容易,这为开发人员在开发应用程序时提供了灵活性。

“高性能”和“低内存使用率”是这个库的主要特点,你可以从下面这张图中窥见一斑:

还在纠结Dapper或者EF Core?不妨试试“混合ORM”--RepoDb_sql

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很多没有的可立即使用的丰富功能集。使用它,必将帮助你快速交付代码。

举报

相关推荐

0 条评论