基於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}) 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.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;
        }
    }
}

 

在IServiceCollection容器中注冊:

services.AddScoped(typeof(IRepository<>), typeof(Repository<>));


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM