前言: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() > ? dataResult.ToList()[] : 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, , );
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

至此就没有了,各位同学可以再行封装。

如有不足的地方,还望见谅!

.Net Core中使用Dapper构建泛型仓储的更多相关文章

  1. .NET Core中使用Dapper操作Oracle存储过程最佳实践

    为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为OracleDbType.RefCursor,输出为:ParameterDir ...

  2. NET Core中使用Dapper操作Oracle存储过程

    .NET Core中使用Dapper操作Oracle存储过程最佳实践   为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为Or ...

  3. DotNet Core中使用dapper

    我们都知道,ORM全称是,Object Relationship Mapper,即,对象关系映射.也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架叫做dappe ...

  4. ASP.NET Core中使用Dapper

    ⒈添加 NuGet 包 Install-Package Dapper ⒉封装数据库类型 using System; using System.Collections.Generic; using Sy ...

  5. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  6. 在MVC中使用泛型仓储模式和依赖注入实现增删查改

    标签: 原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository ...

  7. 在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务

    在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务 https://procodeguide.com/programming/polly-in-aspnet-core ...

  8. net core天马行空系列: 泛型仓储和声明式事物实现最优雅的crud操作

    系列目录 1.net core天马行空系列:原生DI+AOP实现spring boot注解式编程 哈哈哈哈,大家好,我就是那个高产似母猪的三合,长久以来,我一直在思考,如何才能实现高效而简洁的仓储模式 ...

  9. MVC中使用泛型仓储模式和依赖注入

    在ASP.NET MVC中使用泛型仓储模式和依赖注入,实现增删查改 原文链接:http://www.codeproject.com/Articles/838097/CRUD-Operations-Us ...

随机推荐

  1. MTK Android ROM与RAM的区别

    ROM与RAM 简单的说,一个完整的计算机系统是由软件和硬件组成的.其中,硬件部分由中央处理单元CPU(包括运算器和控制器).存储器和输入/输出设备构成.目前个人电脑上使用的主板一般只能支持到1GB的 ...

  2. ListView + ArrayAdapter + 接口回调

    众所周知,ListView是安卓最为频繁使用的控件,但是,随着人们审美观的提高,一些初级的ListView已经满足不了需求了,于是,我们必须为自己定制一套专属的ListView,这就需要用到适配器,A ...

  3. spring-cloud feign的多参数传递方案

    查看原文 一.GET请求多参数URL 1.方法一(推荐) @FeignClient(“microservice-provider-user”) public interface UserFeignCl ...

  4. CH5501 环路运输(单调栈)

    传送门 思路: 遇到一个环,用正常人类的思想就先把环从中间截断然后将其补成2*n长度的链.环上的最小距离换到链上就是i以n/2为半径范围内的点(画图肉眼可见).由于两个点是等价的,所以我们考虑有序对( ...

  5. 一、华为模拟器eNSP下载与安装教程

    简单介绍一下 eNSP: eNSP是一款由华为提供的免费的图形化网络仿真工具平台,它将完美呈现真实设备实景(包括华为最新的ARG3路由器和X7系列的交换机),支持大型网络模拟,让你有机会在没有真实设备 ...

  6. git撤销远程commit

    git reset --hard [commit_id] git push origin HEAD --force

  7. ffmpeg 交叉编译 版本4.0.4

    touch run.sh chmod 755 run.sh ./run.sh run.sh #!/bin/sh ./configure \ --arch=aarch64 \ --cpu=armv8-a ...

  8. 【半监督学习】MixMatch、UDA、ReMixMatch、FixMatch

    半监督学习(Semi-Supervised Learning,SSL)的 SOTA 一次次被 Google 刷新,从 MixMatch 开始,到同期的 UDA.ReMixMatch,再到 2020 年 ...

  9. 五分钟!用python绘制漂亮的系统架构图

    Diagrams 是一个基于Python绘制云系统架构的模块,它能够通过非常简单的描述就能可视化架构,并支持以下6个云产品的图标: AWS.Azure.GCP.K8s.阿里云 和 Oracle 云 基 ...

  10. C - Sigma Function LightOJ - 1336 (数论)

    一个让人脑洞大开的题. 题目大意比较简单,询问[1,n]有多少个数其因子和为偶数. 因子分解定理中求因子和的公式是 f(n)=(1+p1+p1^2+p1^3+...+p1^a1)(1+p2+p2^2+ ...