.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项 ...
随机推荐
- webpack--介绍、安装及入门
最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代码,相信很多人都见过. <scr ...
- js模拟post提交表单
function post(URL, PARAMS) { var temp = document.createElement("form"); ...
- 【转】Redis内部数据结构详解 -- skiplist
本文是<Redis内部数据结构详解>系列的第六篇.在本文中,我们围绕一个Redis的内部数据结构--skiplist展开讨论. Redis里面使用skiplist是为了实现sorted s ...
- 分享下超实用的用skura frp做内网穿透的经验
操作目的: 使无公网ip的主机能被外网访问,实现ssh对服务器的远程管理 硬件准备: 1.服务端:skura frp主机(skura frp 免费提供,有待创建) 2.客户端:接在无线路由器(内网)上 ...
- Java笔记---枚举类和注解
Java笔记---枚举类和注解 一.枚举类 自定义枚举类 方式一:JDK5.0之前自定义枚举类 class Seasons { //1. 声明Seasons对象的属性 private final St ...
- AndroidStudio报错:GradleSyncIssues-Could not install Gradle distribution from...
场景 在使用Android Studio 新建 App项目后,编译时提示: GradleSyncIssues-Could not install Gradle distribution from... ...
- Python面向对象设计小结
转自林海峰老师,学习之余做的笔记. class School: zhuti='学生和老师‘ def __init__(self,name,dic,country): self.mingzi=name ...
- NetCore文件上传校验返回未授权401,文件仍然执行上传操作,要如何解决呢
这是代码:https://files.cnblogs.com/files/suterfo/NetCoreTestPro.rar 运行步骤: 一.使用Visual Studio2017打开项目,并F5运 ...
- java new一个对象的过程中发生了什么?
java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载.加载并初始化类完成后,再进行对象的创建工作. 我们先假设是第一次使用该类,这样的话n ...
- 2019sdqdCSP-J游记
特别鸣谢:Miku -------------------------- 中午上了车,和ljx坐在一块.太阳是多么好啊,我们在看着刚出的tg题,cmz找不到了准考证,sbl在临时打印准考证 等到好不容 ...