.Net Core中使用Dapper構建泛型倉儲

前言:Dapper是.NET的簡單對象映射器,在速度方面擁有ORM的稱號,與使用原始ADO.NET讀取數據一樣快。ORM是對象關係映射器,它負責數據庫和編程語言之間的映射。

倉儲主要是用來解耦業務邏輯層與數據訪問層,降低耦合,使得程序在後期有很強的擴展性。

首先新建四個類庫

IRepository:

 Repository:

引用IRepository

 IServices:

 Services:

 引用IServices、IRepository

 導入兩個包:Dapper,Npgsql(我用的是pgsql數據庫)

 萬事俱備,上代碼了。

IBaseRepository

 public interface IBaseRepository<TEntity> where TEntity : class, new()
    {
        /// <summary>
        /// 查詢數據集合
        /// </summary>
        /// <param name="sql">查詢Sql語句或存儲過程名稱</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>返回指定實體泛型</returns>
        Task<TEntity> QueryFirst(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null);

        /// <summary>
        /// 返回 dataset
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="param"></param>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        /// <param name="commandType"></param>
        /// <returns></returns>
        Task<DataSet> Query(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null);

        /// <summary>
        /// 查詢數據集合
        /// </summary>
        /// <param name="sql">查詢Sql語句或存儲過程名稱</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="buffered">是否將查詢結果緩存到內存中(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>返回指定泛型集合</returns>
        Task<IEnumerable<TEntity>> QueryList(string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null);


        /// <summary>
        /// 簡單分頁,返回分頁後的泛型集合
        /// </summary>
        /// <typeparam name="T">分頁後的泛型集合</typeparam>
        /// <param name="sql">查詢Sql語句或存儲過程名稱</param>
        /// <param name="totalCount">返回 總記錄數</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="buffered">是否將查詢結果緩存到內存中(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>返回分頁後的泛型集合</returns>
        Task<Tuple<IEnumerable<TEntity>, int>> QueryPagination(string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null);

        /// <summary>
        /// 2條Sql語句查詢
        /// </summary>
        /// <typeparam name="TFirst">實體集合一</typeparam>
        /// <typeparam name="TSecond">實體集合二</typeparam>
        /// <param name="sql">2條查詢語句</param>
        /// <param name="tfList">返回第一條語句的實體集合</param>
        /// <param name="tsList">返回第二條語句的實體集合</param>
        /// <param name="param">參數值(可選)</param>
        Task<Tuple<List<TFirst>, List<TSecond>>> QueryMultiple<TFirst, TSecond>(string sql, object param = null);

        /// <summary>
        /// 3條Sql語句查詢
        /// </summary>
        /// <typeparam name="TFirst">實體集合一</typeparam>
        /// <typeparam name="TSecond">實體集合二</typeparam>
        /// <typeparam name="TThird">實體集合三</typeparam>
        /// <param name="sql">5條查詢語句</param>
        /// <param name="tfList">返回第一條語句的實體集合</param>
        /// <param name="tsList">返回第二條語句的實體集合</param>
        /// <param name="ttList">返回第三條語句的實體集合</param>
        /// <param name="param">參數值(可選)</param>
        Task<Tuple<List<TFirst>, List<TSecond>, List<TThird>>> QueryMultiple<TFirst, TSecond, TThird>(string sql, object param = null);


        /// <summary>
        /// 4條Sql語句查詢
        /// </summary>
        /// <typeparam name="TFirst">實體集合一</typeparam>
        /// <typeparam name="TSecond">實體集合二</typeparam>
        /// <typeparam name="TThird">實體集合三</typeparam>
        /// <typeparam name="TFour">實體集合四</typeparam>
        /// <param name="sql">5條查詢語句</param>
        /// <param name="tfList">返回第一條語句的實體集合</param>
        /// <param name="tsList">返回第二條語句的實體集合</param>
        /// <param name="ttList">返回第三條語句的實體集合</param>
        /// <param name="tfourList">返回第四條語句的實體集合</param>
        /// <param name="param">參數值(可選)</param>
        Task<Tuple<List<TFirst>, List<TSecond>, List<TThird>, List<TFour>>> QueryMultiple<TFirst, TSecond, TThird, TFour>(string sql, object param = null);

        /// <summary>
        /// 5條Sql語句查詢
        /// </summary>
        /// <typeparam name="TFirst">實體集合一</typeparam>
        /// <typeparam name="TSecond">實體集合二</typeparam>
        /// <typeparam name="TThird">實體集合三</typeparam>
        /// <typeparam name="TFour">實體集合四</typeparam>
        /// <typeparam name="TFive">實體集合五</typeparam>
        /// <param name="sql">5條查詢語句</param>
        /// <param name="tfList">返回第一條語句的實體集合</param>
        /// <param name="tsList">返回第二條語句的實體集合</param>
        /// <param name="ttList">返回第三條語句的實體集合</param>
        /// <param name="tfourList">返回第四條語句的實體集合</param>
        /// <param name="tfiveList">返回第五條語句的實體集合</param>
        /// <param name="param">參數值(可選)</param>
        Task<Tuple<List<TFirst>, List<TSecond>, List<TThird>, List<TFour>, List<TFive>>> QueryMultiple<TFirst, TSecond, TThird, TFour, TFive>(string sql, object param = null);


        /// <summary>
        /// 查詢單個實體類型
        /// </summary>
        /// <typeparam name="T">實體類型</typeparam>
        /// <param name="sql">查詢Sql語句或存儲過程名稱</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="buffered">是否將查詢結果緩存到內存中(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>泛型實體類型</returns>
        Task<TEntity> QueryOne(string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null);

        /// <summary>
        /// 執行sql語句,返回受影響的行數
        /// </summary>
        /// <param name="sql">查詢Sql語句或存儲過程名稱</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>返回受影響的行數</returns>
        Task<int> Execute(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null);

        /// <summary>
        /// 執行sql語句,返回第一行第一列
        /// </summary>
        /// <typeparam name="T">指定類型</typeparam>
        /// <param name="sql">查詢Sql語句</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>返回返回第一行第一列</returns>
        Task<TEntity> ExecuteScalar(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null);

        /// <summary>
        /// 執行存儲過程,返回第一行第一列
        /// </summary>
        /// <typeparam name="T">指定類型</typeparam>
        /// <param name="command">存儲過程名稱</param>
        /// <param name="paras">參數鍵值對</param>
        /// <returns>返回第一行第一列</returns>
        Task<TEntity> Execute(string command, Dictionary<string, object> paras);
    }

BaseRepository

  public class BaseRepository<TEntity> : IBaseRepository<TEntity> where TEntity : class, new()
    {
        private readonly IConfiguration _configuration;
        public BaseRepository(IConfiguration configuration) => this._configuration = configuration;

        /// <summary>
        /// 創建數據庫連接,並打開連接
        /// 連接字符串寫在 json 配置文件裏面
        /// </summary>
        /// <returns>IDbConnection</returns>
        public IDbConnection GetOpenConn()
        {
            IDbConnection con = null;
            string connectionString = _configuration["Connection:dbContent"];
            con = new NpgsqlConnection(connectionString);
            try
            {
                con.Open();
            }
            catch (Exception ex)
            {
                throw new Exception("數據庫連接錯誤:" + ex.Message);
            }

            return con;
        }


        /// <summary>
        /// 查詢數據集合
        /// </summary>
        /// <param name="sql">查詢Sql語句或存儲過程名稱</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>返回指定實體泛型</returns>
        public async Task<TEntity> QueryFirst(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null)
        {
            using (IDbConnection con = this.GetOpenConn())
            {
                return con.QueryFirst<TEntity>(sql, param, transaction, commandTimeout, commandType);
            }
        }

        /// <summary>
        /// 返回 dataset
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="param"></param>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        /// <param name="commandType"></param>
        /// <returns></returns>
        public async Task<DataSet> Query(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null)
        {
            using (IDbConnection con = GetOpenConn())
            {
                IDataReader reader = con.ExecuteReader(sql, param, transaction, commandTimeout, commandType);
                DataSet ds = new XDataSet();
                ds.Load(reader, LoadOption.OverwriteChanges, null, new DataTable[] { });
                return ds;
            }
        }

/// <summary> /// 查詢數據集合 /// </summary> /// <param name="sql">查詢Sql語句或存儲過程名稱</param> /// <param name="param">參數值(可選)</param> /// <param name="transaction">事務名稱(可選)</param> /// <param name="buffered">是否將查詢結果緩存到內存中(可選)</param> /// <param name="commandTimeout">超時時間(可選)</param> /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param> /// <returns>返回指定泛型集合</returns> public async Task<IEnumerable<TEntity>> QueryList(string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null) { using (IDbConnection con = GetOpenConn()) { return con.Query<TEntity>(sql, param, transaction, buffered, commandTimeout, commandType); } } /// <summary> /// 簡單分頁,返回分頁後的泛型集合 /// </summary> /// <typeparam name="T">分頁後的泛型集合</typeparam> /// <param name="sql">查詢Sql語句或存儲過程名稱</param> /// <param name="totalCount">返回 總記錄數</param> /// <param name="param">參數值(可選)</param> /// <param name="transaction">事務名稱(可選)</param> /// <param name="buffered">是否將查詢結果緩存到內存中(可選)</param> /// <param name="commandTimeout">超時時間(可選)</param> /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param> /// <returns>返回分頁後的泛型集合</returns> public async Task<Tuple<IEnumerable<TEntity>, int>> QueryPagination(string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null) { using (IDbConnection con = GetOpenConn()) { var multi = con.QueryMultiple(sql, param, transaction, commandTimeout, commandType); int totalCount = int.Parse(multi.Read<long>().Single().ToString()); return Tuple.Create<IEnumerable<TEntity>, int>(multi.Read<TEntity>(), totalCount); } } /// <summary> /// 2條Sql語句查詢 /// </summary> /// <typeparam name="TFirst">實體集合一</typeparam> /// <typeparam name="TSecond">實體集合二</typeparam> /// <param name="sql">2條查詢語句</param> /// <param name="tfList">返回第一條語句的實體集合</param> /// <param name="tsList">返回第二條語句的實體集合</param> /// <param name="param">參數值(可選)</param> public async Task<Tuple<List<TFirst>, List<TSecond>>> QueryMultiple<TFirst, TSecond>(string sql, object param = null) { using (IDbConnection con = GetOpenConn()) { var multi = con.QueryMultiple(sql, param); var tfList = new List<TFirst>(); var tsList = new List<TSecond>(); if (!multi.IsConsumed) { tfList = multi.Read<TFirst>().ToList(); tsList = multi.Read<TSecond>().ToList(); } return Tuple.Create<List<TFirst>, List<TSecond>>(tfList, tsList); } } /// <summary> /// 3條Sql語句查詢 /// </summary> /// <typeparam name="TFirst">實體集合一</typeparam> /// <typeparam name="TSecond">實體集合二</typeparam> /// <typeparam name="TThird">實體集合三</typeparam> /// <param name="sql">5條查詢語句</param> /// <param name="tfList">返回第一條語句的實體集合</param> /// <param name="tsList">返回第二條語句的實體集合</param> /// <param name="ttList">返回第三條語句的實體集合</param> /// <param name="param">參數值(可選)</param> public async Task<Tuple<List<TFirst>, List<TSecond>, List<TThird>>> QueryMultiple<TFirst, TSecond, TThird>(string sql, object param = null) { using (IDbConnection con = GetOpenConn()) { var multi = con.QueryMultiple(sql, param); var tfList = new List<TFirst>(); var tsList = new List<TSecond>(); var ttList = new List<TThird>(); if (!multi.IsConsumed) { tfList = multi.Read<TFirst>().ToList(); tsList = multi.Read<TSecond>().ToList(); ttList = multi.Read<TThird>().ToList(); } return Tuple.Create<List<TFirst>, List<TSecond>, List<TThird>>(tfList, tsList, ttList); } } /// <summary> /// 4條Sql語句查詢 /// </summary> /// <typeparam name="TFirst">實體集合一</typeparam> /// <typeparam name="TSecond">實體集合二</typeparam> /// <typeparam name="TThird">實體集合三</typeparam> /// <typeparam name="TFour">實體集合四</typeparam> /// <param name="sql">5條查詢語句</param> /// <param name="tfList">返回第一條語句的實體集合</param> /// <param name="tsList">返回第二條語句的實體集合</param> /// <param name="ttList">返回第三條語句的實體集合</param> /// <param name="tfourList">返回第四條語句的實體集合</param> /// <param name="param">參數值(可選)</param> public async Task<Tuple<List<TFirst>, List<TSecond>, List<TThird>, List<TFour>>> QueryMultiple<TFirst, TSecond, TThird, TFour>(string sql, object param = null) { using (IDbConnection con = GetOpenConn()) { var multi = con.QueryMultiple(sql, param); var tfList = new List<TFirst>(); var tsList = new List<TSecond>(); var ttList = new List<TThird>(); var tfourList = new List<TFour>(); if (!multi.IsConsumed) { tfList = multi.Read<TFirst>().ToList(); tsList = multi.Read<TSecond>().ToList(); ttList = multi.Read<TThird>().ToList(); tfourList = multi.Read<TFour>().ToList(); } return Tuple.Create<List<TFirst>, List<TSecond>, List<TThird>, List<TFour>>(tfList, tsList, ttList, tfourList); } } /// <summary> /// 5條Sql語句查詢 /// </summary> /// <typeparam name="TFirst">實體集合一</typeparam> /// <typeparam name="TSecond">實體集合二</typeparam> /// <typeparam name="TThird">實體集合三</typeparam> /// <typeparam name="TFour">實體集合四</typeparam> /// <typeparam name="TFive">實體集合五</typeparam> /// <param name="sql">5條查詢語句</param> /// <param name="tfList">返回第一條語句的實體集合</param> /// <param name="tsList">返回第二條語句的實體集合</param> /// <param name="ttList">返回第三條語句的實體集合</param> /// <param name="tfourList">返回第四條語句的實體集合</param> /// <param name="tfiveList">返回第五條語句的實體集合</param> /// <param name="param">參數值(可選)</param> public async Task<Tuple<List<TFirst>, List<TSecond>, List<TThird>, List<TFour>, List<TFive>>> QueryMultiple<TFirst, TSecond, TThird, TFour, TFive>(string sql, object param = null) { using (IDbConnection con = GetOpenConn()) { var multi = con.QueryMultiple(sql, param); var tfList = new List<TFirst>(); var tsList = new List<TSecond>(); var ttList = new List<TThird>(); var tfourList = new List<TFour>(); var tfiveList = new List<TFive>(); if (!multi.IsConsumed) { tfList = multi.Read<TFirst>().ToList(); tsList = multi.Read<TSecond>().ToList(); ttList = multi.Read<TThird>().ToList(); tfourList = multi.Read<TFour>().ToList(); tfiveList = multi.Read<TFive>().ToList(); } return Tuple.Create<List<TFirst>, List<TSecond>, List<TThird>, List<TFour>, List<TFive>>(tfList, tsList, ttList, tfourList, tfiveList); } } /// <summary> /// 查詢單個實體類型 /// </summary> /// <typeparam name="T">實體類型</typeparam> /// <param name="sql">查詢Sql語句或存儲過程名稱</param> /// <param name="param">參數值(可選)</param> /// <param name="transaction">事務名稱(可選)</param> /// <param name="buffered">是否將查詢結果緩存到內存中(可選)</param> /// <param name="commandTimeout">超時時間(可選)</param> /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param> /// <returns>泛型實體類型</returns> public async Task<TEntity> QueryOne(string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null) { var dataResult = await QueryList(sql, param, transaction, buffered, commandTimeout, commandType); return dataResult != null && dataResult.Count() > 0 ? dataResult.ToList()[0] : new TEntity(); } /// <summary> /// 執行sql語句,返回受影響的行數 /// </summary> /// <param name="sql">查詢Sql語句或存儲過程名稱</param> /// <param name="param">參數值(可選)</param> /// <param name="transaction">事務名稱(可選)</param> /// <param name="commandTimeout">超時時間(可選)</param> /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param> /// <returns>返回受影響的行數</returns> public async Task<int> Execute(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) { using (IDbConnection con = GetOpenConn()) { return con.Execute(sql, param, transaction, commandTimeout, commandType); } } /// <summary> /// 執行sql語句,返回第一行第一列 /// </summary> /// <typeparam name="T">指定類型</typeparam> /// <param name="sql">查詢Sql語句</param> /// <param name="param">參數值(可選)</param> /// <param name="transaction">事務名稱(可選)</param> /// <param name="commandTimeout">超時時間(可選)</param> /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param> /// <returns>返回返回第一行第一列</returns> public async Task<TEntity> ExecuteScalar(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) { using (IDbConnection con = GetOpenConn()) { return con.ExecuteScalar<TEntity>(sql, param, transaction, commandTimeout, commandType); } } /// <summary> /// 執行存儲過程,返回第一行第一列 /// </summary> /// <typeparam name="T">指定類型</typeparam> /// <param name="command">存儲過程名稱</param> /// <param name="paras">參數鍵值對</param> /// <returns>返回第一行第一列</returns> public async Task<TEntity> Execute(string command, Dictionary<string, object> paras) { using (IDbConnection con = GetOpenConn()) { IDbCommand com = con.CreateCommand(); com.CommandText = command; com.CommandType = CommandType.StoredProcedure; if (paras != null) { foreach (var item in paras.Keys) { IDbDataParameter para = com.CreateParameter(); para.Value = paras[item]; para.ParameterName = item; com.Parameters.Add(para); } } return (TEntity)com.ExecuteScalar(); } } /// <summary> /// 數據適配器,擴展Fill方法 /// .NET的DataSet.Load方法,底層調用DataAdapter.Fill(DataTable[], IDataReader, int, int) /// Dapper想要返回DataSet,需要重寫Load方法,不必傳入DataTable[],因爲數組長度不確定 /// </summary> public class XLoadAdapter : DataAdapter { /// <summary> /// 數據適配器 /// </summary> public XLoadAdapter() { } /// <summary> /// 讀取dataReader /// </summary> /// <param name="ds"></param> /// <param name="dataReader"></param> /// <param name="startRecord"></param> /// <param name="maxRecords"></param> /// <returns></returns> public int FillFromReader(DataSet ds, IDataReader dataReader, int startRecord, int maxRecords) { return this.Fill(ds, "Table", dataReader, startRecord, maxRecords); } } /// <summary> /// 擴展Load方法 /// </summary> public class XDataSet : DataSet { /// <summary> /// Dapper想要返回DataSet,需要重寫Load方法 /// </summary> /// <param name="reader">IDataReader</param> /// <param name="loadOption">LoadOption</param> /// <param name="handler">FillErrorEventHandler</param> /// <param name="tables">DataTable</param> public override void Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler handler, params DataTable[] tables) { XLoadAdapter adapter = new XLoadAdapter { FillLoadOption = loadOption, MissingSchemaAction = MissingSchemaAction.AddWithKey }; if (handler != null) { adapter.FillError += handler; } adapter.FillFromReader(this, reader, 0, 0); if (!reader.IsClosed && !reader.NextResult()) { reader.Close(); } } } }

IBaseServices

   public interface IBaseServices<TEntity> where TEntity : class
    {
        /// <summary>
        /// 查詢數據集合
        /// </summary>
        /// <param name="sql">查詢Sql語句或存儲過程名稱</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>返回指定實體泛型</returns>
        Task<TEntity> QueryFirst(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null);

        /// <summary>
        /// 返回 dataset
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="param"></param>
        /// <param name="transaction"></param>
        /// <param name="commandTimeout"></param>
        /// <param name="commandType"></param>
        /// <returns></returns>
        Task<DataSet> Query(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null);

        /// <summary>
        /// 查詢數據集合
        /// </summary>
        /// <param name="sql">查詢Sql語句或存儲過程名稱</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="buffered">是否將查詢結果緩存到內存中(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>返回指定泛型集合</returns>
        Task<IEnumerable<TEntity>> QueryList(string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null);


        /// <summary>
        /// 簡單分頁,返回分頁後的泛型集合
        /// </summary>
        /// <typeparam name="T">分頁後的泛型集合</typeparam>
        /// <param name="sql">查詢Sql語句或存儲過程名稱</param>
        /// <param name="totalCount">返回 總記錄數</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="buffered">是否將查詢結果緩存到內存中(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>返回分頁後的泛型集合</returns>
        Task<Tuple<IEnumerable<TEntity>, int>> QueryPagination(string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null);

        /// <summary>
        /// 2條Sql語句查詢
        /// </summary>
        /// <typeparam name="TFirst">實體集合一</typeparam>
        /// <typeparam name="TSecond">實體集合二</typeparam>
        /// <param name="sql">2條查詢語句</param>
        /// <param name="tfList">返回第一條語句的實體集合</param>
        /// <param name="tsList">返回第二條語句的實體集合</param>
        /// <param name="param">參數值(可選)</param>
        Task<Tuple<List<TFirst>, List<TSecond>>> QueryMultiple<TFirst, TSecond>(string sql, object param = null);

        /// <summary>
        /// 3條Sql語句查詢
        /// </summary>
        /// <typeparam name="TFirst">實體集合一</typeparam>
        /// <typeparam name="TSecond">實體集合二</typeparam>
        /// <typeparam name="TThird">實體集合三</typeparam>
        /// <param name="sql">5條查詢語句</param>
        /// <param name="tfList">返回第一條語句的實體集合</param>
        /// <param name="tsList">返回第二條語句的實體集合</param>
        /// <param name="ttList">返回第三條語句的實體集合</param>
        /// <param name="param">參數值(可選)</param>
        Task<Tuple<List<TFirst>, List<TSecond>, List<TThird>>> QueryMultiple<TFirst, TSecond, TThird>(string sql, object param = null);


        /// <summary>
        /// 4條Sql語句查詢
        /// </summary>
        /// <typeparam name="TFirst">實體集合一</typeparam>
        /// <typeparam name="TSecond">實體集合二</typeparam>
        /// <typeparam name="TThird">實體集合三</typeparam>
        /// <typeparam name="TFour">實體集合四</typeparam>
        /// <param name="sql">5條查詢語句</param>
        /// <param name="tfList">返回第一條語句的實體集合</param>
        /// <param name="tsList">返回第二條語句的實體集合</param>
        /// <param name="ttList">返回第三條語句的實體集合</param>
        /// <param name="tfourList">返回第四條語句的實體集合</param>
        /// <param name="param">參數值(可選)</param>
        Task<Tuple<List<TFirst>, List<TSecond>, List<TThird>, List<TFour>>> QueryMultiple<TFirst, TSecond, TThird, TFour>(string sql, object param = null);

        /// <summary>
        /// 5條Sql語句查詢
        /// </summary>
        /// <typeparam name="TFirst">實體集合一</typeparam>
        /// <typeparam name="TSecond">實體集合二</typeparam>
        /// <typeparam name="TThird">實體集合三</typeparam>
        /// <typeparam name="TFour">實體集合四</typeparam>
        /// <typeparam name="TFive">實體集合五</typeparam>
        /// <param name="sql">5條查詢語句</param>
        /// <param name="tfList">返回第一條語句的實體集合</param>
        /// <param name="tsList">返回第二條語句的實體集合</param>
        /// <param name="ttList">返回第三條語句的實體集合</param>
        /// <param name="tfourList">返回第四條語句的實體集合</param>
        /// <param name="tfiveList">返回第五條語句的實體集合</param>
        /// <param name="param">參數值(可選)</param>
        Task<Tuple<List<TFirst>, List<TSecond>, List<TThird>, List<TFour>, List<TFive>>> QueryMultiple<TFirst, TSecond, TThird, TFour, TFive>(string sql, object param = null);


        /// <summary>
        /// 查詢單個實體類型
        /// </summary>
        /// <typeparam name="T">實體類型</typeparam>
        /// <param name="sql">查詢Sql語句或存儲過程名稱</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="buffered">是否將查詢結果緩存到內存中(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>泛型實體類型</returns>
        Task<TEntity> QueryOne(string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null);

        /// <summary>
        /// 執行sql語句,返回受影響的行數
        /// </summary>
        /// <param name="sql">查詢Sql語句或存儲過程名稱</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>返回受影響的行數</returns>
        Task<int> Execute(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null);

        /// <summary>
        /// 執行sql語句,返回第一行第一列
        /// </summary>
        /// <typeparam name="T">指定類型</typeparam>
        /// <param name="sql">查詢Sql語句</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>返回返回第一行第一列</returns>
        Task<TEntity> ExecuteScalar(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null);

        /// <summary>
        /// 執行存儲過程,返回第一行第一列
        /// </summary>
        /// <typeparam name="T">指定類型</typeparam>
        /// <param name="command">存儲過程名稱</param>
        /// <param name="paras">參數鍵值對</param>
        /// <returns>返回第一行第一列</returns>
        Task<TEntity> Execute(string command, Dictionary<string, object> paras);
    }

BaseServices

 public class BaseServices<TEntity> : IBaseServices<TEntity> where TEntity : class, new()
    {
        public IBaseRepository<TEntity> BaseDal;

        /// <summary>
        /// 查詢數據集合
        /// </summary>
        /// <param name="sql">查詢Sql語句或存儲過程名稱</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>返回指定實體泛型</returns>
        public async Task<TEntity> QueryFirst(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null)
        {
            return await BaseDal.QueryFirst(sql, param, transaction, commandTimeout, commandType);
        }

        public Task<DataSet> Query(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null)
        {
            return BaseDal.Query(sql, param, transaction, commandTimeout, commandType);
        }

        /// <summary>
        /// 查詢數據集合
        /// </summary>
        /// <param name="sql">查詢Sql語句或存儲過程名稱</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="buffered">是否將查詢結果緩存到內存中(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>返回指定泛型集合</returns>
        public async Task<IEnumerable<TEntity>> QueryList(string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null)
        {
            return await BaseDal.QueryList(sql, param, transaction, buffered, commandTimeout, commandType);
        }


        /// <summary>
        /// 簡單分頁,返回分頁後的泛型集合
        /// </summary>
        /// <typeparam name="T">分頁後的泛型集合</typeparam>
        /// <param name="sql">查詢Sql語句或存儲過程名稱</param>
        /// <param name="totalCount">返回 總記錄數</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="buffered">是否將查詢結果緩存到內存中(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>返回分頁後的泛型集合</returns>
        public async Task<Tuple<IEnumerable<TEntity>, int>> QueryPagination(string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null)
        {

            return await BaseDal.QueryPagination(sql, param, transaction, buffered, commandTimeout, commandType);
        }

        /// <summary>
        /// 2條Sql語句查詢
        /// </summary>
        /// <typeparam name="TFirst">實體集合一</typeparam>
        /// <typeparam name="TSecond">實體集合二</typeparam>
        /// <param name="sql">2條查詢語句</param>
        /// <param name="tfList">返回第一條語句的實體集合</param>
        /// <param name="tsList">返回第二條語句的實體集合</param>
        /// <param name="param">參數值(可選)</param>
        public async Task<Tuple<List<TFirst>, List<TSecond>>> QueryMultiple<TFirst, TSecond>(string sql, object param = null)
        {

            return await BaseDal.QueryMultiple<TFirst, TSecond>(sql, param);
        }

        /// <summary>
        /// 3條Sql語句查詢
        /// </summary>
        /// <typeparam name="TFirst">實體集合一</typeparam>
        /// <typeparam name="TSecond">實體集合二</typeparam>
        /// <typeparam name="TThird">實體集合三</typeparam>
        /// <param name="sql">5條查詢語句</param>
        /// <param name="tfList">返回第一條語句的實體集合</param>
        /// <param name="tsList">返回第二條語句的實體集合</param>
        /// <param name="ttList">返回第三條語句的實體集合</param>
        /// <param name="param">參數值(可選)</param>
        public async Task<Tuple<List<TFirst>, List<TSecond>, List<TThird>>> QueryMultiple<TFirst, TSecond, TThird>(string sql, object param = null)
        {
            return await BaseDal.QueryMultiple<TFirst, TSecond, TThird>(sql, param);
        }

        /// <summary>
        /// 4條Sql語句查詢
        /// </summary>
        /// <typeparam name="TFirst">實體集合一</typeparam>
        /// <typeparam name="TSecond">實體集合二</typeparam>
        /// <typeparam name="TThird">實體集合三</typeparam>
        /// <typeparam name="TFour">實體集合四</typeparam>
        /// <param name="sql">5條查詢語句</param>
        /// <param name="tfList">返回第一條語句的實體集合</param>
        /// <param name="tsList">返回第二條語句的實體集合</param>
        /// <param name="ttList">返回第三條語句的實體集合</param>
        /// <param name="tfourList">返回第四條語句的實體集合</param>
        /// <param name="param">參數值(可選)</param>
        public async Task<Tuple<List<TFirst>, List<TSecond>, List<TThird>, List<TFour>>> QueryMultiple<TFirst, TSecond, TThird, TFour>(string sql, object param = null)
        {

            return await BaseDal.QueryMultiple<TFirst, TSecond, TThird, TFour>(sql, param);
        }

        /// <summary>
        /// 5條Sql語句查詢
        /// </summary>
        /// <typeparam name="TFirst">實體集合一</typeparam>
        /// <typeparam name="TSecond">實體集合二</typeparam>
        /// <typeparam name="TThird">實體集合三</typeparam>
        /// <typeparam name="TFour">實體集合四</typeparam>
        /// <typeparam name="TFive">實體集合五</typeparam>
        /// <param name="sql">5條查詢語句</param>
        /// <param name="tfList">返回第一條語句的實體集合</param>
        /// <param name="tsList">返回第二條語句的實體集合</param>
        /// <param name="ttList">返回第三條語句的實體集合</param>
        /// <param name="tfourList">返回第四條語句的實體集合</param>
        /// <param name="tfiveList">返回第五條語句的實體集合</param>
        /// <param name="param">參數值(可選)</param>
        public async Task<Tuple<List<TFirst>, List<TSecond>, List<TThird>, List<TFour>, List<TFive>>> QueryMultiple<TFirst, TSecond, TThird, TFour, TFive>(string sql, object param = null)
        {
            return await BaseDal.QueryMultiple<TFirst, TSecond, TThird, TFour, TFive>(sql, param);
        }

        /// <summary>
        /// 查詢單個實體類型
        /// </summary>
        /// <typeparam name="T">實體類型</typeparam>
        /// <param name="sql">查詢Sql語句或存儲過程名稱</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="buffered">是否將查詢結果緩存到內存中(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>泛型實體類型</returns>
        public async Task<TEntity> QueryOne(string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null)
        {
            return await BaseDal.QueryOne(sql, param, transaction, buffered, commandTimeout, commandType);
        }

        /// <summary>
        /// 執行sql語句,返回受影響的行數
        /// </summary>
        /// <param name="sql">查詢Sql語句或存儲過程名稱</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>返回受影響的行數</returns>
        public async Task<int> Execute(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null)
        {
            return await BaseDal.Execute(sql, param, transaction, commandTimeout, commandType);
        }

        /// <summary>
        /// 執行sql語句,返回第一行第一列
        /// </summary>
        /// <typeparam name="T">指定類型</typeparam>
        /// <param name="sql">查詢Sql語句</param>
        /// <param name="param">參數值(可選)</param>
        /// <param name="transaction">事務名稱(可選)</param>
        /// <param name="commandTimeout">超時時間(可選)</param>
        /// <param name="commandType">指定如果解釋sql字符串:語句/存儲過程(可選)</param>
        /// <returns>返回返回第一行第一列</returns>
        public async Task<TEntity> ExecuteScalar(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null)
        {
            return await ExecuteScalar(sql, param, transaction, commandTimeout, commandType);
        }

        /// <summary>
        /// 執行存儲過程,返回第一行第一列
        /// </summary>
        /// <typeparam name="T">指定類型</typeparam>
        /// <param name="command">存儲過程名稱</param>
        /// <param name="paras">參數鍵值對</param>
        /// <returns>返回第一行第一列</returns>
        public async Task<TEntity> Execute(string command, Dictionary<string, object> paras)
        {
            return await BaseDal.Execute(command, paras);
        }
    }

下面寫一個簡單的查詢,用戶登錄判斷用戶名與密碼

   public interface IUserInfoRepository: IBaseRepository<UserInfo>
    {
    }

  public class UserInfoRepository : BaseRepository<UserInfo>, IUserInfoRepository
    {
        public UserInfoRepository(IConfiguration configuration) : base(configuration)
        {
        }
    }

    public interface IUserInfoServices:IBaseServices<UserInfo>
    {
        Task<IEnumerable<UserInfo>> QueryUserInfo(string userName, string password);
    }

 public class UserInfoServices : BaseServices<UserInfo>, IUserInfoServices
    {
        IUserInfoRepository _dal;
        public UserInfoServices(IUserInfoRepository dal)
        {
            this._dal = dal;
            base.BaseDal = dal;
        }

        public async Task<IEnumerable<UserInfo>> QueryUserInfo(string userName, string password)
        {var Result = await _dal.QueryList($"SELECT * FROM user_info where user_name='{userName}' and password='{password}' limit 1 OFFSET 0");
            return Result;
        }
    }

在控制器中以依賴注入的形式使用(前提是你要藉助IOC容器注入好你要使用的對象),如果對此有困惑,可看下面這篇博客:

https://www.cnblogs.com/zhangnever/p/12324133.html

 至此就沒有了,各位同學可以再行封裝。

如有不足的地方,還望見諒!

Smiling Face on Microsoft Windows 10 May 2019 Update

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章