基于Dapper的泛型Repository

卧疾丰暇豫,翰墨时间作。这篇文章主要讲述基于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 < 1) pageIndex = 1; if (pageSize < 1) pageSize = 20; var startRow = (pageIndex - 1) * pageSize; //mysql分页 sql = $"SELECT * FROM ({sql}) tt1LIMIT {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 = https://www.songbingjia.com/android/list; pagingResult.Paged.TotalRowCount = 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 > 0 & & this.PageSize > 0) return (int)Math.Ceiling((decimal)this.TotalRow / this.PageSize); else return 0; } } }

 
【基于Dapper的泛型Repository】 在IServiceCollection容器中注册:
services.AddScoped(typeof(IRepository< > ), typeof(Repository< > ));


    推荐阅读