.NET还在纠结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在“微”和“全”操作的使用之间切换很容易,这为开发人员在开发应用程序时提供了灵活性。

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

  

.NET还在纠结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("SELECT * FROM [dbo].[User] WHERE (Id = @Id);", new { Id = 1 }).FirstOrDefault();

  }

  //Fluent

  using (var connection = new SqlConnection(ConnectionString))

  {

  var user = connection.Query(e => e.Id == 1).FirstOrDefault();

  }

  //Raw-SQL

  using (var connection = new SqlConnection(ConnectionString))

  {

  var affectedRows = connection.ExecuteScalar("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);

  }

  多表查询

  using (var connection = new SqlConnection(ConnectionString))

  {

  var orderId = 10045;

  var tuple = connection.QueryMultiple(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(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(page: page,

  rowsPerBatch: rowsPerBatch,

  orderBy: orderBy,

  where: e => e.IsActive == true);

  }结论

  篇幅有限,RepoDb的其他功能在这就不做介绍了,你可以到官网(repodb/)进行详细了解。

  总体来说,使用RepoDb开发代码更容易、更快捷。

  RepoDb具有Dapper很多没有的可立即使用的丰富功能集。使用它,必将帮助你快速交付代码。

  文章来源于My IO ,作者My IO

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值