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

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

18abc9dd99008047542a1d37cd5ea4dc.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android chart坐标轴互换,android - MPAndroidChart:在BarChart中将X轴的标签旋转90度 - SO中文参考 - www.soinside.com...

只需覆盖XAxisRenderer和renderAxisLabels(c: Canvas)方法。并将其设置为barChart itemView.barChart.setXAxisRenderer(CustomBarChartRenderer(itemView.barChart.viewPortHandler, itemView.barChart.xAxis, itemView.barChart.rendererXAxis.transformer))import android.g…

Rails IDE 有很多选择,但是具体到ubuntu 64bit 选择的余地就不多了,这里选择Aptana Studio 3 Beta...

1 下载 http://www.aptana.com/downloads/start 2 根据 要求安装sun JDK 1.6.* 安装步骤参考&#xff1a; 1. 编辑 /etc/apt/sources.list&#xff0c;去掉注释&#xff1a; ## Uncomment the following two lines to add software from Canonicals## partner repository.## Th…

使用 PHP 7 给 Web 应用加速

PHP 20周年了&#xff01;&#xff1f;&#xff1f; PHP 首发通告&#xff0c;1995年6月8日 发布于 COMP.INFOSYSTEMS.WWW.AUTHORING.CGI 主题&#xff1a;正式宣布&#xff1a;个人主页工具&#xff08;Personal Home Page Tools&#xff09;正式宣布个人主页工具&#xff08;…

mvc教程

第一章 mvc概述 入门 需要安装 Visual Studio 2008 或 Visual Web Developer 2008 Express 来构建 ASP.NET MVC 应用程序。还需要下载 ASP.NET MVC Framework。 如果没有 Visual Studio 2008&#xff0c;可以从下面的网址下载 90 天试用版&#xff1a; http://msdn.microsoft.c…

windows下面怎么github ssh 公钥,然后克隆项目

windos下面怎么github ssh 公钥,然后克隆项目 第一步、 1. 安装git,从程序目录打开 "Git Bash" 2. 键入命令:ssh-keygen -t rsa -C "email@email.com" 我的邮箱是chen_yu@kuyu.com , "email@email.com"是github账号 3. 提醒你输入key的…

连破四次吉尼斯世界纪录!厨师界再出神人,用一公斤拉面缔造了一代传奇,背后却是简单的原理……

全世界只有3.14 % 的人关注了爆炸吧知识超模君最喜欢的就是公司楼下海底捞火锅面。不仅是面确实好吃&#xff0c;更重要的是因为海底捞拉面小哥的技艺十分精湛&#xff01;提臀、收腹&#xff0c;只见拉面小哥化身蹦迪达人&#xff0c;在旋转跳跃中舞动拉面。一顿猛如虎的操作之…

微软推出 .NET 官方社区论坛

James 近日发布博客&#xff08;https://devblogs.microsoft.com/dotnet/introducing-the-net-tech-community-forums/&#xff09;&#xff0c;推出 .NET 官方社区论坛&#xff0c;为开发者提供一个官方的交流平台&#xff0c;小道消息&#xff0c;微软即将上线中文版的.NET网…

android sdk中添加自定义api,android SDK中添加自定义api【转】

本文的思路&#xff1a;android APP调用自定义java API,自定义java API调用自定义jni接口1&#xff1a;在android源码目录framework/base下面创建add目录add目录里面的结构如下&#xff1a;里面的Nadd.java android_jnitest_Nadd.cpp 和Android.mk内容如下&#xff1a;Nadd.jav…

HtmlGenericControl

HtmlGenericControl 构造函数 (String)使用指定的标记初始化 HtmlGenericControl 类的新实例。命名空间&#xff1a; System.Web.UI.HtmlControls 程序集&#xff1a; System.Web&#xff08;在 System.Web.dll 中&#xff09; 语法Public Sub New ( _tag As String _ )public …

远程控制利器TeamViewer使用教程(图)

TeamViewer是什么&#xff1f; 他是一款免费的可以穿透内网的远程控制软件&#xff0c;可以实现桌面共享&#xff0c;文件传送等功能&#xff0c;简单一点说就是和QQ远程协助一样&#xff0c;但是比QQ的远程协助功能更为强大。 TeamViewer与木马有什么区别&#xff1f; 说到远程…

POJ-3635 Full Tank? 变形最短路

题目链接&#xff1a;http://poj.org/problem?id3635 容易想到用二维数组记录状态求最短路&#xff0c;然后用优先队列优化&#xff0c;类似于Dijkstra和BFS。我开始设计的过程是直接直接从当前点向相邻点转移并找出所有可能状态&#xff0c;结果TLE。貌似是无关状态太多了&am…

Android之Bitmap学习总结

BitMap类&#xff1a; public void recycle()——回收位图占用的内存空间&#xff0c;把位图标记为Dead public final boolean isRecycled() ——判断位图内存是否已释放 public final int getWidth()——获取位图的宽度 public final int getHeight()——获取位图的高度 pub…

千万别让男朋友穿你的短裙......

1 工作太辛苦&#xff0c;我要走了...▼2 应该很有效&#xff1f;▼3 疑车有据&#xff01;&#xff01;▼4 这是一部色魔功法...▼5 穿上女友的衣服居然毫无违和感▼视频来源见水印&#xff0c;侵删6 整挺好&#xff01;▼7 这只有熊猫可以驾驭得了......▼你点的每个赞&…

迎接.NET 6,《dotnet+Linux中文手册》完整PDF开放下载!

昨晚已经正式发布了.NET6,具体参见&#xff1a;https://devblogs.microsoft.com/dotnet/announcing-net-6/。这是.NET团队和社区努力一年的成果&#xff0c;C# 10 和 F# 6 有很大的语言改进&#xff0c;使代码更简单、更好。性能有了巨大的提升&#xff0c;我们看到微软的云服务…

excel函数中if android,在Android中阅读Excel

目前我正在开发android开发.根据要求,应用程序应该能够读取Excel文件以进行数据输入.正如其他人从这个主题开始,我已经完成了Java Excel Api和Apache POI,但两者都需要进行一些修改以满足我的要求&#xff1a;JExcel API&#xff1a;– 不能支持XLSXApache POI&#xff1a;– 支…

javaIo流实际应用

/*查看目录下所有的文件*/ package cn.file; import java.io.File;public class Text2 {public static void main(String[] args) {File anew File("F:\\图片");File a1new File("F:\\你的");chek(a1);}public static void chek(File f3) {//查看目录…

Android之网络编程之网络通信几种方式实例分享

这篇文章主要介绍了android 网络编程之网络通信几种方式&#xff0c;有需要的朋友可以参考一下 现在总结了六种方式&#xff1a; &#xff08;1&#xff09;针对TCP/IP的Socket、ServerSocket &#xff08;2&#xff09;针对UDP的DatagramSocket、DatagramPackage。这里需要注意…

常用MIME类型(Flv,Mp4的mime类型设置)

也许你会在纳闷&#xff0c;为什么我上传了flv或MP4文件到服务器&#xff0c;可输入正确地址通过http协议来访问总是出现“无法找到该页”的404错误呢&#xff1f;这就表明mp4格式文件是服务器无法识别的&#xff0c;其实&#xff0c;这是没有在iis中将相应的MIME类型进行设置的…

史上四大“杀人”建筑,烧掉几百亿,却犯低级错误,网友:有钱人的智商,我不懂

全世界只有3.14 % 的人关注了爆炸吧知识本文转自普象工业设计小站这个世界上有多少荒谬的建筑&#xff1f;国内土味审美的大楼只是冰山一角在更多的国家里耗费巨资&#xff0c;却无比失败的工程比土味大楼更多更荒唐你也许听说过美国这座会跳舞的大桥耗资千万&#xff0c;由优秀…

迎.NET6,今日先送200P全新视频教程 / 源码

昨晚已经正式发布了.NET6,具体参见&#xff1a;https://devblogs.microsoft.com/dotnet/announcing-net-6/。这是.NET团队和社区努力一年的成果&#xff0c;C# 10 和 F# 6 有很大的语言改进&#xff0c;使代码更简单、更好。性能有了巨大的提升&#xff0c;我们看到微软的云服务…