轻量ORM-SqlRepoEx (一)SqlRepoEx介绍
一、SqlRepo项目
发现SqlRepo项目库是在构建自动代码工具时。对于数据访问,在.Net下,有很多选择,比如EF,但EF使用起来,不是很方便的。以前一直使用Atk.Expression库+System.Data.SqlClient来进行数据操作,总体来说希望有这样一个ORM:
1、能方便支持Mysql、SQLServert等数据库;
2、框架不能复杂、功能强大但不需要牺牲数据访问速度;
3、能使用Lambda表达式,以方便.Net强大的功能;
4、使用强类型而不是弱类型构建;
5、能需时转换成SQL语句,易用Lambda表达式来构建拼接SQL语句,减少魔法字串的出现。
SqlRepo项目是一个.NET库,用于构建带有Lambda表达式的SQL语句,并将结果映射到对象的工具。在使用SqlRepo中,发现基本能达到要求。但在使用中,发现不少bug,同时功能上不是特别完善,所以Fork了一个,强化其功能,将其命名为SqlRepoEx。并增加如下(1)自定特性;(2)、动态指定查询源;(3)解决拼接语句,使用where以外方法时,缺少Where子句时的错误;(4)、增加操作时,不再受限于实例必需有Id的自增自段;(5)、表达示使时,可直接使用变量;
二、简单的例子
1、有如下业务类
public class ToDo
{
public DateTime CreatedDate { get; set; }
public bool IsCompleted { get; set; }
public string Task { get; set; }
}
2、使用SqlRepoEx查询
var repository = RepoFactory.Create<ToDo>();
var results = repository.Query()
.Select(e => e.Id, e => e.Task, e => e.CreatedDate)
.Where(e => e.IsCompleted == false)
.Go();
3、在2中,如果与数据库连接访问,可以直接返回一个IEnumerable<ToDo>的结果集,如果只需要获取SqL语句只需要:
string querystr = repository.Query()
.Select(e => e.Id, e => e.Task, e => e.CreatedDate)
.Where(e => e.IsCompleted == false)
.Sql();
querystr结果为:"SELECT [dbo].[ToDo].[Id] , [dbo].[ToDo].[Task], [dbo].[ToDo].[CreatedDate]
FROM [dbo].[ToDo]
WHERE ([dbo].[ToDo].[IsCompleted] = 0)"
三、关于SqlRepoEx性能,在原生的SqlRepo有对其进行对比测试:
比较库
1、SqlRepo
2、Dapper
3、EF Core 2.0
测试环境
1、每个测试都运行在包含5万条记录的SQL数据库上。测试运行105次,前5个测试被忽略,以支持JIT和任何动态IL。
2、测试机器是一个在i7 7700 k上运行4个核心的VM。最后一次是在2018年3月4日。
测试:选择返回所有记录(Select All Records)
| 库 | 最好结果(ms) | 总时间 |
|---|---|---|
| Dapper | 51.03ms | 6250.34ms |
| EF Core | 163.11ms | 19874.59ms |
| SqlRepo | 50.34ms | 6260.17ms |
测试:选择一条记录(Select TOP 1)
| 库 | 最好结果(ms) | 总时间 |
|---|---|---|
| Dapper | 0.3ms | 73.73ms |
| EF Core | 0.66ms | 42.85ms |
| SqlRepo | 0.35ms | 40.16ms |
测试:Select TOP 5000
| 库 | 最好结果(ms) | 总时间 |
|---|---|---|
| Dapper | 3.91ms | 533ms |
| EF Core | 9.81ms | 2082.93ms |
| SqlRepo | 4ms | 526.43ms |
测试:动态数据测试
| 库 | 最好结果(ms) | 总时间 |
|---|---|---|
| Dapper | 13.16ms | 2382.85ms |
| EF Core | 39.93ms | 5106.13ms |
| SqlRepo | 12.74ms | 2284.85ms |
具体测试源码见 https://github.com/SqlRepo/Benchmarks
轻量ORM-SqlRepoEx (一)SqlRepoEx介绍的更多相关文章
- SqlSugar轻量ORM
蓝灯软件数据股份有限公司项目,代码开源. SqlSugar是一款轻量级的MSSQL ORM ,除了具有媲美ADO的性能外还具有和EF相似简单易用的语法. 学习列表 0.功能更新 1.SqlSuga ...
- Dapper.NET——轻量ORM
Dapper.NET使用 http://www.cnblogs.com/yankliu-vip/p/4182892.html 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Da ...
- Dapper.NET—轻量ORM
Dapper.NET使用 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Dapper(4.0)为例. 2.1 在数据库中建立几张表. 2.2实体类. 3.使用方法 3.1 一 ...
- C# Dapper 轻量ORM调试对SQLServer
Dapper简介 Dapper只有一个代码文件,完全开源,你可以放在项目里的任何位置,来实现数据到对象的ORM操作,体积小速度快. 使用ORM的好处是增.删.改很快,不用自己写sql,因为这都是重复技 ...
- Linux桌面最轻量的Dock之Plank介绍
官方的文档描述 Plank 是“这个星球上最简洁的 dock”.该项目的目的就是仅提供一个 dock 需要的功能,尽管这是很基础的一个库,却可以被扩展,创造其他的含更多高级功能的 dock 程序. 这 ...
- 轻量ORM-SqlRepoEx (九)与Dapper共舞
Dapper就另一个轻量ORM,Dapper及其扩展解决了数据访问端的大部门问题,提供了如数据事务管理.缓存等支持.SqlRepoEx的重点解决了Lambda转换成SQL语句,使SQL使用强类型编写, ...
- 轻量ORM-SqlRepoEx (二)初始化SqlRepoEx
一.SqlRepoEx引用 暂时没放至nuget上,可以直接到https://github.com/AzThinker/SqlRepoEx下载源码,编译引用. (一).静态引用 1.需引用以下dll在 ...
- 轻量ORM-SqlRepoEx介绍
轻量级 ORM-SqlRepoEx 介绍 SqlRepoEx是 .Net平台下兼容.NET Standard 2.0人一个轻型的ORM.解决了Lambda转Sql语句这一难题,SqlRepoEx使用的 ...
- OWIN轻量型框架介绍
OWIN轻量型框架介绍 阅读目录 引言 框架的特色 如何启动 各项功能 静态路由的3种写法 伪静态路由的支持 处理Form表单提交的文件 流式处理Post请求的数据 多种请求类型自动识别 响应处理 请 ...
- 轻量型ORM框架Dapper的使用
在真实的项目开发中,可能有些人比较喜欢写SQL语句,但是对于EF这种ORM框架比较排斥,那么轻量型的Dapper就是一个不错的选择,即让你写sql语句了,有进行了关系对象映射.其实对于EF吧,我说下我 ...
随机推荐
- win7 docker的受难记——exit status 255的终极解决
一 我真的认识到我有很多坏习惯,而这次坏就坏在我老是用Docker Quickstart Terminal,而不直接用cmd. 毕竟Docker Quickstart Terminal看属性就是cmd ...
- SGI STL红黑树中迭代器的边界值分析
前言 一段程序最容易出错的就是在判断或者是情况分类的边界地方,所以,应该对于许多判断或者是情况分类的边界要格外的注意.下面,就分析下STL中红黑树的迭代器的各种边界情况.(注意:分析中STL使用的版本 ...
- poj 1655 树的重心 && define注意事项
http://blog.csdn.net/acdreamers/article/details/16905653 题意:给定一棵树,求树的重心的编号以及重心删除后得到的最大子树的节点个数size,如果 ...
- easyui datagrid 获取行数据某个字段
首先要能获取datagrid 的row对象 即:var row = $('#datagrid').datagrid('getData').rows[index]; 之后我们就可以通过类似row.nam ...
- 【Linux】sudo用户权限管理
权力下放 一.权力分配- sudo Sudo是Unix/Linux平台上的一个非常有用的工具,它允许系统管理员分配给普通用户一些合理的"权力",让 他们执行一些只有超级用户或其他特 ...
- App后台开发架构实践笔记
1 App后台入门 1.1 App后台的功能 (1)远程存储数据: (2)消息中转. 1.2 App后台架构 架构设计的流程 (1) 根据App的设计,梳理出App的业务流程: (2) 把每个业务流程 ...
- React学习笔记 - JSX简介
React Learn Note 2 React学习笔记(二) 标签(空格分隔): React JavaScript 一.JSX简介 像const element = <h1>Hello ...
- IEEP-网络设计
IEEP-网络设计 网络设计概述 网络设计概述 1.负责把网络规划阶段获得的客户需求运用技术手段予以规范化体现 2.网络设计一般遵循模块化指导方针,分模块进行设计 3.网络设计的输出成果必须是规范的. ...
- 转载: Centos7 升级python3,解决升级后不兼容问题
Centos7配置更新国内yum源 http://blog.csdn.net/qingguiyu/article/details/50721956 Centos7 升级python3,解决升级后不兼容 ...
- CSS3中REM使用详解
px 在Web页面制作中,我们一般使用“px”来设置我们的文本,因为他比较稳定和精确.但是这种方法存在一个问题,当用户在浏览器中浏览我们制作的Web页面时,他改变了浏览器的字体大小(虽然一般人不会去改 ...