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

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了还在纠结Dapper或者EF Core?不妨试试“混合ORM”--RepoDb相关的知识,希望对你有一定的参考价值。

在.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“,记住我!

以上是关于还在纠结Dapper或者EF Core?不妨试试“混合ORM”--RepoDb的主要内容,如果未能解决你的问题,请参考以下文章

还在手动部署springboot项目?不妨试试它,让你部署项目飞起来!

NET Core 实战 Dapper 扩展数据访问

asp.net core使用Dapper操作Sqlserver/Oracle

ef core 子对象集合插入顺序

.net core efcore 动态 orderby

.NET Core Beta驱动已出,动手写EF Core Oracle