.NetCore学习笔记:二、基于Dapper的泛型Repository
为减少代码量,这里实现一个基于Dapper的泛型Repository。
这里需要引用Dapper.dll和Dapper.Contrib.dll。
接口定义:
/// <summary>
/// Repository接口
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IRepository<T> where T : class, IEntity
{
/// <summary>
/// 查询
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <param name="commandType"></param>
/// <returns></returns>
IEnumerable<T> Query(string sql, object param = null, CommandType? commandType = null); /// <summary>
/// 删除行数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <returns></returns>
bool Delete(T entity);
/// <summary>
/// 删除表所有数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
bool DeleteAll();
/// <summary>
/// 获取行数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="id"></param>
/// <returns></returns>
T Get(object id);
/// <summary>
/// 获取表的所有数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
IEnumerable<T> GetAll();
/// <summary>
/// 添加行数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <returns></returns>
long Insert(T entity);
/// <summary>
/// 更新行数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <returns></returns>
bool Update(T entity); /// <summary>
/// 分页方法
/// </summary>
/// <param name="sql"></param>
/// <param name="pageIndex">当前页码</param>
/// <param name="pageSize">每页显示条数</param>
/// <param name="param">参数</param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
PagedResult<T> GetPageList(string sql, int pageIndex, int pageSize, object param = null);
}
接口实现:
/// <summary>
/// 泛型Repository
/// </summary>
/// <typeparam name="T"></typeparam>
public class Repository<T> : IRepository<T> where T : class, IEntity
{
private IUnitOfWork _unitOfWork; public Repository(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
/// <summary>
/// 查询
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="param"></param>
/// <param name="commandType"></param>
/// <returns></returns>
public IEnumerable<T> Query(string sql, object param = null, CommandType? commandType = null)
{
var r = _unitOfWork.DbConnection.Query<T>(sql, param: param, transaction: _unitOfWork.DbTransaction, commandType: commandType);
return r;
}
/// <summary>
/// 删除行数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entityToDelete"></param>
/// <returns></returns>
public bool Delete(T entity)
{
var r = _unitOfWork.DbConnection.Delete<T>(entity, _unitOfWork.DbTransaction);
return r;
}
/// <summary>
/// 删除表所有数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public bool DeleteAll()
{
var r = _unitOfWork.DbConnection.DeleteAll<T>(_unitOfWork.DbTransaction);
return r;
}
/// <summary>
/// 获取行数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="id"></param>
/// <returns></returns>
public T Get(object id)
{
var r = _unitOfWork.DbConnection.Get<T>(id, _unitOfWork.DbTransaction);
return r;
}
/// <summary>
/// 获取表的所有数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public IEnumerable<T> GetAll()
{
var r = _unitOfWork.DbConnection.GetAll<T>(_unitOfWork.DbTransaction);
return r;
}
/// <summary>
/// 添加行数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <returns></returns>
public long Insert(T entity)
{
var r = _unitOfWork.DbConnection.Insert<T>(entity, _unitOfWork.DbTransaction);
return r;
}
/// <summary>
/// 更新行数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <returns></returns>
public bool Update(T entity)
{
var r = _unitOfWork.DbConnection.Update<T>(entity, _unitOfWork.DbTransaction);
return r;
}
/// <summary>
/// 分页方法
/// </summary>
/// <param name="sql"></param>
/// <param name="pageIndex">当前页码</param>
/// <param name="pageSize">每页显示条数</param>
/// <param name="param">参数</param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
public PagedResult<T> GetPageList(string sql, int pageIndex, int pageSize, object param = null)
{
var pagingResult = _unitOfWork.DbConnection.GetPageList<T>(sql, pageIndex, pageSize, param: param, transaction: _unitOfWork.DbTransaction);
return pagingResult;
}
}
GetPageList为Dapper的一个分页扩展:
/// <summary>
/// 分页方法
/// </summary>
/// <param name="sql"></param>
/// <param name="pageIndex">当前页码</param>
/// <param name="pageSize">每页显示条数</param>
/// <param name="param">参数</param>
/// <param name="transaction"></param>
/// <param name="commandTimeout"></param>
/// <returns></returns>
public static PagedResult<T> GetPageList<T>(this IDbConnection connection, string sql, int pageIndex, int pageSize, object param = null, IDbTransaction transaction = null, int? commandTimeout = null)
{
if (pageIndex < ) pageIndex = ;
if (pageSize < ) pageSize = ;
var startRow = (pageIndex - ) * pageSize; //MySql分页
sql = $"SELECT * FROM ({sql}) tt1 LIMIT {startRow},{pageSize}; SELECT COUNT(1) FROM ({sql}) tt2;"; PagedResult<T> pagingResult = new PagedResult<T>();
pagingResult.Paged.PageIndex = pageIndex;
pagingResult.Paged.PageSize = pageSize;
using (var result = connection.QueryMultiple(sql, param: param, transaction, commandTimeout))
{
var list = result.Read<T>();
var totalCount = result.Read<long>().FirstOrDefault();
pagingResult.Data = list;
pagingResult.Paged.TotalRow = totalCount;
}
return pagingResult;
}
PagedResult类:
/// <summary>
/// 分页模型
/// </summary>
/// <typeparam name="T"></typeparam>
public class PagedResult<T>
{
public PagedResult()
{
this.Paged = new Paged();
} /// <summary>
/// 结果
/// </summary>
public IEnumerable<T> Data { get; set; } /// <summary>
/// 分页数据,包含数据总行数、当前页码、页数据行数和总的分页数
/// </summary>
public Paged Paged { get; set; }
}
Paged类:
/// <summary>
/// 分页数据
/// </summary>
public class Paged
{
/// <summary>
/// 当前页码
/// </summary>
public int PageIndex { get; set; }
/// <summary>
/// 页数据行数
/// </summary>
public int PageSize { get; set; }
/// <summary>
/// 总行数
/// </summary>
public long TotalRow { get; set; }
/// <summary>
/// 总的分页数
/// </summary>
public int TotalPage
{
get
{
if (this.TotalRow > && this.PageSize > )
return (int)Math.Ceiling((decimal)this.TotalRow / this.PageSize);
else
return ;
}
}
}
在IServiceCollection容器中注册:
services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
源码地址:https://github.com/letnet/NetCoreDemo
.NetCore学习笔记:二、基于Dapper的泛型Repository的更多相关文章
- STM32学习笔记(二) 基于STM32-GPIO的流水灯实现
学会了如何新建一个工程模板,下面就要开始动手实践了.像c/c++中经典的入门代码"hello world"一样,流水灯作为最简单的硬件设备在单片机领域也是入门首推.如果你已经有了一 ...
- .NetCore学习笔记:三、基于AspectCore的AOP事务管理
AOP(面向切面编程),通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- Typescript 学习笔记二:数据类型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- muduo学习笔记(二)Reactor关键结构
目录 muduo学习笔记(二)Reactor关键结构 Reactor简述 什么是Reactor Reactor模型的优缺点 poll简述 poll使用样例 muduo Reactor关键结构 Chan ...
- Go语言学习笔记二: 变量
Go语言学习笔记二: 变量 今天又学了一招如何查看go的版本的命令:go version.另外上一个笔记中的代码还可以使用go run hello.go来运行,只是这种方式不会生成exe文件. 定义变 ...
- amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules
amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...
- amazeui学习笔记二(进阶开发1)--项目结构structure
amazeui学习笔记二(进阶开发1)--项目结构structure 一.总结 1.项目结构:是说的amazeui在github上面的项目结构,二次开发amazeui用 二.项目结构structure ...
- ZooKeeper学习笔记二:API基本使用
Grey ZooKeeper学习笔记二:API基本使用 准备工作 搭建一个zk集群,参考ZooKeeper学习笔记一:集群搭建. 确保项目可以访问集群的每个节点 新建一个基于jdk1.8的maven项 ...
随机推荐
- 访问控制列表 ACL
访问控制列表(Access Control List,ACL) 是路由器和交换机接口的指令列表,用来控制端口进出的数据包.其目的是为了对某种访问进行控制. 作用 ACL可以限制网络流量.提高网络性能. ...
- iptables之路由网关共享上网/端口映射
linux-A 主机配置eth0即可: [root@linux-A ~]# ifconfig eth0|sed -n '2p' inet addr:192.168.20.3 Bcast:192.168 ...
- css实现文字过长显示省略号的方法
<div class="title">当对象内文本溢出时显示省略标记</div> 这是一个例子,其实我们只需要显示如下长度: css实现网页中文字过长截取. ...
- 实际开发常用的jquey事件类型,并运用到图片相册
鼠标事件 .click 鼠标单击 .dblclick 鼠标双击 // 单击事件 $("a").click(function(){ $("img").eq($ ...
- Linux如何定位文件在磁盘的物理位置
我在学习研究Linux内核结构的时候,思考过一个问题:Linux如何定位文件在磁盘的物理位置每个文件都有一个inode,inode在内核代码中的数据结构如下: 1 struct ext4_inode ...
- html文件如何下载文件
HTML中下载文件两种方法:a标签下载:js下载; <!-- 网页地址和图片地址同源的情况下这样是可以的,不同源则是直接打开这个地址 --> <!-- 方法一:同源情况下载 --&g ...
- C#中的WinFrom技术实现串口通讯助手(附源码)
C#中的WinFrom技术实现串口通讯助手(附源码) 实现的功能: 1.实现自动加载可用串口. 2.打开串口,并且使用C#状态栏显示串口的状态. 3.实现了串口的接收数据和发送数据功能. 4.串口 ...
- Python中verbaim标签使用详解
verbatim标签:默认在"DTL"模板中是会去解析那些特殊字符串的,比如{% 和 %}以及{{等.如果你在某个代码片段中不想使用"DTL"的解析引擎,那么就 ...
- 谷歌BBR拥塞算法内核更新
为什么想到这个呢,算法什么的又不太懂,这是 因为搭建VPN + BBR 与之简直绝配 有的人搭建SSR ,配一个什么锐速,还需要降内核版本, 而且还容易出错,降了之后更加容易出现兼容性问题,所以偶尔看 ...
- AGC014-F Strange Sorting
题意 \(n\)-排列,反复进行:将序列中为前缀最大值的数全部移动到序列末(两种数不改变相对位置),问经过多少次后第一次全部升序排列 做法 定义:用high表示为前缀最大值,low则反之 考虑忽略\( ...