using Dapper;
using Dapper.Contrib.Extensions;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using Znyc.Recruitment.Admin.Commons.Core.Dapper;
using Znyc.Recruitment.Admin.Commons.Core.DataManager;
using Znyc.Recruitment.Admin.Commons.DataManager;
using Znyc.Recruitment.Admin.Commons.DependencyInjection;
using Znyc.Recruitment.Admin.Commons.Entitys;
using Znyc.Recruitment.Admin.Commons.Enums;
using Znyc.Recruitment.Admin.Commons.IDbContext;
using Znyc.Recruitment.Admin.Commons.IRepositories;
using Znyc.Recruitment.Admin.Commons.Log;
using Znyc.Recruitment.Admin.Commons.Pages;
namespace Znyc.Recruitment.Admin.Commons.Repositories
{
///
/// 泛型仓储,实现泛型仓储接口
///
/// 实体类型
/// 实体主键类型
public abstract class BaseRepository : IRepository, ITransientDependency
where T : Entity
{
#region 构造函数及基本配置
///
/// EF DBContext
///
private readonly IDbContextCore _dbContext;
private readonly IDbContextFactory _dbContextFactory;
///
///
protected DbSet DbSet => DbContext.GetDbSet();
///
/// 获取访问数据库配置
///
protected DbConnectionOptions dbConnectionOptions = DBServerProvider.GeDbConnectionOptions();
///
/// 需要初始化的对象表名
///
protected string tableName = typeof(T).GetCustomAttribute(false)?.Name;
///
/// 数据库参数化访问的占位符
///
protected string parameterPrefix = "@";
///
/// 防止和保留字、关键字同名的字段格式,如[value]
///
protected string safeFieldFormat = "[{0}]";
///
/// 数据库的主键字段名,若主键不是Id请重载BaseRepository设置
///
protected string primaryKey = "Id";
///
/// 排序字段
///
protected string sortField;
///
/// 是否为降序
///
protected bool isDescending = true;
///
/// 选择的字段,默认为所有(*)
///
protected string selectedFields = " * ";
///
/// 是否开启多租户
///
protected bool isMultiTenant = false;
///
/// 排序字段
///
public string SortField
{
get => sortField;
set => sortField = value;
}
public string PrimaryKey => primaryKey;
///
/// 构造方法
///
public BaseRepository()
{
}
///
/// 构造方法,注入上下文
///
/// 上下文
public BaseRepository(IDbContextCore dbContext)
{
if (dbContext == null)
{
throw new ArgumentNullException(nameof(dbContext));
}
_dbContext = dbContext;
}
///
/// 构造方法,注入上下文
///
/// 上下文
public BaseRepository(IDbContextFactory dbContextFactory)
{
_dbContextFactory = dbContextFactory;
}
#endregion 构造函数及基本配置
#region Dapper 操作
///
/// 用Dapper原生方法操作数据,支持读写操作
///
public IDbConnection DapperConn => new DapperDbContext().GetConnection();
///
/// 用Dapper原生方法,仅用于只读数据库
///
public IDbConnection DapperConnRead => new DapperDbContext().GetConnection(false);
#region 查询获得对象和列表
///
/// 根据id获取一个对象
///
/// 主键
///
public virtual T Get(TKey primaryKey)
{
return DapperConnRead.Get(primaryKey);
}
///
/// 异步根据id获取一个对象
///
/// 主键
///
public virtual async Task GetAsync(TKey primaryKey)
{
return await DapperConnRead.GetAsync(primaryKey);
}
///
/// 根据条件获取一个对象
///
/// 查询条件
///
public virtual T GetWhere(string where)
{
if (HasInjectionData(where))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", where));
throw new Exception("检测出SQL注入的恶意数据");
}
if (string.IsNullOrEmpty(where))
{
@where = "1=1";
}
string sql = $"select * from {tableName} ";
sql += " where " + where;
return DapperConnRead.QueryFirstOrDefault(sql);
}
///
/// 根据条件异步获取一个对象
///
/// 查询条件
///
public virtual async Task GetWhereAsync(string where)
{
if (HasInjectionData(where))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", where));
throw new Exception("检测出SQL注入的恶意数据");
}
if (string.IsNullOrEmpty(where))
{
@where = "1=1";
}
string sql = $"select * from {tableName} ";
sql += " where " + where;
return await DapperConnRead.QueryFirstOrDefaultAsync(sql);
}
///
/// 获取所有数据,谨慎使用
///
/// 事务
///
public virtual IEnumerable GetAll(IDbTransaction trans = null)
{
return GetListWhere();
}
///
/// 获取所有数据,谨慎使用
///
///
///
public virtual async Task> GetAllAsync(IDbTransaction trans = null)
{
return await GetListWhereAsync();
}
///
/// 根据查询条件获取数据集合
///
/// 查询条件
/// 事务对象
///
public virtual IEnumerable GetListWhere(string where = null, IDbTransaction trans = null)
{
if (HasInjectionData(where))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", where));
throw new Exception("检测出SQL注入的恶意数据");
}
string sql = $"select {selectedFields} from {tableName} ";
if (!string.IsNullOrWhiteSpace(where))
{
sql += " where " + @where;
}
return DapperConnRead.Query(sql, trans);
}
///
/// 根据查询条件获取数据集合
///
/// 查询条件
/// 事务对象
///
public virtual async Task> GetListWhereAsync(string where = null, IDbTransaction trans = null)
{
if (HasInjectionData(where))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", where));
throw new Exception("检测出SQL注入的恶意数据");
}
string sql = $"select {selectedFields} from {tableName} where IsDeleted=0";
if (!string.IsNullOrWhiteSpace(where))
{
sql += " and" + @where;
}
return await DapperConnRead.QueryAsync(sql, trans);
}
///
/// 根据查询条件查询前多少条数据
///
/// 多少条数据
/// 查询条件
/// 事务对象
///
public virtual IEnumerable GetListTopWhere(int top, string where = null, IDbTransaction trans = null)
{
if (HasInjectionData(where))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", where));
throw new Exception("检测出SQL注入的恶意数据");
}
string sql = $"select top {top} {selectedFields} from " + tableName;
;
if (dbConnectionOptions.DatabaseType == DatabaseType.SqlServer)
{
if (!string.IsNullOrWhiteSpace(where))
{
sql += " where " + @where;
}
}
else if (dbConnectionOptions.DatabaseType == DatabaseType.MySql)
{
sql = $"select {selectedFields} from " + tableName;
if (!string.IsNullOrWhiteSpace(where))
{
sql += " where " + @where;
}
sql += $" LIMIT 0,{top}; ";
}
return DapperConnRead.Query(sql, trans);
}
///
/// 根据查询条件查询前多少条数据
///
/// 多少条数据
/// 查询条件
/// 事务对象
///
public virtual async Task> GetListTopWhereAsync(int top, string where = null,
IDbTransaction trans = null)
{
if (HasInjectionData(where))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", where));
throw new Exception("检测出SQL注入的恶意数据");
}
string sql = $"select top {top} {selectedFields} from " + tableName;
if (dbConnectionOptions.DatabaseType == DatabaseType.SqlServer)
{
if (!string.IsNullOrWhiteSpace(where))
{
sql += " where " + @where;
}
}
else if (dbConnectionOptions.DatabaseType == DatabaseType.MySql)
{
sql = $"select {selectedFields} from " + tableName;
if (!string.IsNullOrWhiteSpace(where))
{
sql += " where " + @where;
}
sql += $" LIMIT 0,{top}; ";
}
return await DapperConnRead.QueryAsync(sql, trans);
}
///
/// 查询软删除的数据,如果查询条件为空,即查询所有软删除的数据
///
/// 查询条件
/// 事务对象
///
public virtual IEnumerable GetAllByIsIsDeleted(string where = null, IDbTransaction trans = null)
{
if (HasInjectionData(where))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", where));
throw new Exception("检测出SQL注入的恶意数据");
}
string sqlWhere = " IsDeleted=1 ";
if (!string.IsNullOrWhiteSpace(where))
{
sqlWhere += " and " + @where;
}
return GetListWhere(sqlWhere, trans);
}
///
/// 查询未软删除的数据,如果查询条件为空,即查询所有未软删除的数据
///
/// 查询条件
/// 事务对象
///
public virtual IEnumerable GetAllByIsNotIsDeleted(string where = null, IDbTransaction trans = null)
{
if (HasInjectionData(where))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", where));
throw new Exception("检测出SQL注入的恶意数据");
}
string sqlWhere = " IsDeleted=0 ";
if (!string.IsNullOrWhiteSpace(where))
{
sqlWhere += " and " + @where;
}
return GetListWhere(sqlWhere, trans);
}
///
/// 查询有效的数据,如果查询条件为空,即查询所有有效的数据
///
/// 查询条件
/// 事务对象
///
public virtual IEnumerable GetAllByIsEnabledMark(string where = null, IDbTransaction trans = null)
{
if (HasInjectionData(where))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", where));
throw new Exception("检测出SQL注入的恶意数据");
}
string sqlWhere = " IsEnabled=1 ";
if (!string.IsNullOrWhiteSpace(where))
{
sqlWhere += " and " + @where;
}
return GetListWhere(sqlWhere, trans);
}
///
/// 查询无效的数据,如果查询条件为空,即查询所有无效的数据
///
/// 查询条件
/// 事务对象
///
public virtual IEnumerable GetAllByIsNotEnabledMark(string where = null, IDbTransaction trans = null)
{
if (HasInjectionData(where))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", where));
throw new Exception("检测出SQL注入的恶意数据");
}
string sqlWhere = " IsEnabled=0 ";
if (!string.IsNullOrWhiteSpace(where))
{
sqlWhere += " and " + @where;
}
return GetListWhere(sqlWhere, trans);
}
///
/// 查询未软删除且有效的数据,如果查询条件为空,即查询所有数据
///
/// 查询条件
/// 事务对象
///
public virtual IEnumerable GetAllByIsNotDeleteAndEnabledMark(string where = null,
IDbTransaction trans = null)
{
if (HasInjectionData(where))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", where));
throw new Exception("检测出SQL注入的恶意数据");
}
string sqlWhere = " IsDeleted=0";
if (!string.IsNullOrWhiteSpace(where))
{
sqlWhere += " and " + @where;
}
return GetListWhere(sqlWhere, trans);
}
///
/// 查询软删除的数据,如果查询条件为空,即查询所有软删除的数据
///
/// 查询条件
/// 事务对象
///
public virtual async Task> GetAllByIsIsDeletedAsync(string where = null,
IDbTransaction trans = null)
{
if (HasInjectionData(where))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", where));
throw new Exception("检测出SQL注入的恶意数据");
}
string sqlWhere = " IsDeleted=1";
if (!string.IsNullOrWhiteSpace(where))
{
sqlWhere += " and " + @where;
}
return await GetListWhereAsync(sqlWhere, trans);
}
///
/// 查询未软删除的数据,如果查询条件为空,即查询所有未软删除的数据
///
/// 查询条件
/// 事务对象
///
public virtual async Task> GetAllByIsNotIsDeletedAsync(string where = null,
IDbTransaction trans = null)
{
if (HasInjectionData(where))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", where));
throw new Exception("检测出SQL注入的恶意数据");
}
string sqlWhere = " IsDeleted=0 ";
if (!string.IsNullOrWhiteSpace(where))
{
sqlWhere += " and " + @where;
}
return await GetListWhereAsync(sqlWhere, trans);
}
///
/// 查询有效的数据,如果查询条件为空,即查询所有有效的数据
///
/// 查询条件
/// 事务对象
///
public virtual async Task> GetAllByIsEnabledMarkAsync(string where = null,
IDbTransaction trans = null)
{
if (HasInjectionData(where))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", where));
throw new Exception("检测出SQL注入的恶意数据");
}
string sqlWhere = " IsEnabled=1 ";
if (!string.IsNullOrWhiteSpace(where))
{
sqlWhere += " and " + @where;
}
return await GetListWhereAsync(sqlWhere, trans);
}
///
/// 查询未软删除且有效的数据,如果查询条件为空,即查询所有数据
///
/// 查询条件
/// 事务对象
///
public virtual async Task> GetAllByIsNotDeleteAndEnabledMarkAsync(string where = null,
IDbTransaction trans = null)
{
if (HasInjectionData(where))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", where));
throw new Exception("检测出SQL注入的恶意数据");
}
string sqlWhere = " IsDeleted=0";
if (!string.IsNullOrWhiteSpace(where))
{
sqlWhere += " and " + @where;
}
return await GetListWhereAsync(sqlWhere, trans);
}
///
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
///
/// 查询的条件
/// 分页实体
/// 事务对象
/// 指定对象的集合
public virtual List FindWithPager(string condition, PagerInfo info, IDbTransaction trans = null)
{
return FindWithPager(condition, info, SortField, isDescending, trans);
}
///
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
///
/// 查询的条件
/// 分页实体
/// 排序字段
/// 事务对象
/// 指定对象的集合
public virtual List FindWithPager(string condition, PagerInfo info, string fieldToSort,
IDbTransaction trans = null)
{
return FindWithPager(condition, info, fieldToSort, isDescending, trans);
}
///
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
///
/// 查询的条件
/// 分页实体
/// 排序字段
/// 事务对象
/// 指定对象的集合
public virtual async Task> FindWithPagerAsync(string condition, PagerInfo info, string fieldToSort,
IDbTransaction trans = null)
{
return await FindWithPagerAsync(condition, info, fieldToSort, isDescending, trans);
}
///
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
///
/// 查询的条件
/// 分页实体
/// 事务对象
/// 指定对象的集合
public virtual async Task> FindWithPagerAsync(string condition, PagerInfo info,
IDbTransaction trans = null)
{
return await FindWithPagerAsync(condition, info, SortField, trans);
}
///
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
///
/// 查询的条件
/// 分页实体
/// 排序字段
/// 排序方式 true为desc,false为asc
/// 事务对象
/// 指定对象的集合
public virtual List FindWithPager(string condition, PagerInfo info, string fieldToSort, bool desc,
IDbTransaction trans = null)
{
List list = new List();
if (HasInjectionData(condition))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", condition));
throw new Exception("检测出SQL注入的恶意数据");
}
if (string.IsNullOrEmpty(condition))
{
condition = "1=1";
}
PagerHelper pagerHelper = new PagerHelper(tableName, selectedFields, fieldToSort, info.PageSize,
info.CurrenetPageIndex, desc, condition);
string pageSql = pagerHelper.GetPagingSql(true, dbConnectionOptions.DatabaseType);
pageSql += ";" + pagerHelper.GetPagingSql(false, dbConnectionOptions.DatabaseType);
SqlMapper.GridReader reader = DapperConnRead.QueryMultiple(pageSql);
info.RecordCount = reader.ReadFirst();
list = reader.Read().AsList();
return list;
}
///
/// 根据条件查询数据库,并返回对象集合(用于分页数据显示)
///
/// 查询的条件
/// 分页实体
/// 排序字段
/// 排序方式 true为desc,false为asc
/// 事务对象
/// 指定对象的集合
public virtual async Task> FindWithPagerAsync(string condition, PagerInfo info, string fieldToSort,
bool desc, IDbTransaction trans = null)
{
List list = new List();
if (HasInjectionData(condition))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", condition));
throw new Exception("检测出SQL注入的恶意数据");
}
if (string.IsNullOrEmpty(condition))
{
condition = " IsDeleted=0 ";
}
PagerHelper pagerHelper = new PagerHelper(tableName, selectedFields, fieldToSort, info.PageSize,
info.CurrenetPageIndex, desc, condition);
string pageSql = pagerHelper.GetPagingSql(true, dbConnectionOptions.DatabaseType);
pageSql += ";" + pagerHelper.GetPagingSql(false, dbConnectionOptions.DatabaseType);
SqlMapper.GridReader reader = await DapperConnRead.QueryMultipleAsync(pageSql);
info.RecordCount = reader.ReadFirst();
list = reader.Read().AsList();
return list;
}
///
/// 分页查询,自行封装sql语句(仅支持sql server)
/// 非常复杂的查询,可在具体业务模块重写该方法
///
/// 查询条件
/// 分页信息
/// 排序字段
/// 排序方式 true为desc,false为asc
///
///
public virtual List FindWithPagerSql(string condition, PagerInfo info, string fieldToSort, bool desc,
IDbTransaction trans = null)
{
List list = new List();
if (HasInjectionData(condition))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", condition));
throw new Exception("检测出SQL注入的恶意数据");
}
if (string.IsNullOrEmpty(condition))
{
condition = "1=1";
}
StringBuilder sb = new StringBuilder();
int startRows = (info.CurrenetPageIndex - 1) * info.PageSize + 1; //起始记录
int endNum = info.CurrenetPageIndex * info.PageSize; //结束记录
string strOrder = string.Format(" {0} {1}", fieldToSort, desc ? "DESC" : "ASC");
sb.AppendFormat("SELECT count(*) as RecordCount FROM (select {0} FROM {1} where {2}) AS main_temp;",
primaryKey, tableName, condition);
sb.AppendFormat(
"SELECT * FROM ( SELECT ROW_NUMBER() OVER (order by {0}) AS rows ,{1} FROM {2} where {3}) AS main_temp where rows BETWEEN {4} and {5}",
strOrder, selectedFields, tableName, condition, startRows, endNum);
SqlMapper.GridReader reader = DapperConnRead.QueryMultiple(sb.ToString());
info.RecordCount = reader.ReadFirst();
list = reader.Read().AsList();
return list;
}
///
/// 分页查询,自行封装sql语句(仅支持sql server)
/// 非常复杂的查询,可在具体业务模块重写该方法
///
/// 查询条件
/// 分页信息
/// 排序字段
/// 排序方式 true为desc,false为asc
///
///
public virtual async Task> FindWithPagerSqlAsync(string condition, PagerInfo info, string fieldToSort,
bool desc, IDbTransaction trans = null)
{
if (HasInjectionData(condition))
{
Log4NetHelper.Info(string.Format("检测出SQL注入的恶意数据, {0}", condition));
throw new Exception("检测出SQL注入的恶意数据");
}
if (string.IsNullOrEmpty(condition))
{
condition = "1=1";
}
StringBuilder sb = new StringBuilder();
int startRows = (info.CurrenetPageIndex - 1) * info.PageSize + 1; //起始记录
int endNum = info.CurrenetPageIndex * info.PageSize; //结束记录
string strOrder = string.Format(" {0} {1}", fieldToSort, desc ? "DESC" : "ASC");
sb.AppendFormat("SELECT count(*) as RecordCount FROM (select {0} FROM {1} where {2}) AS main_temp;",
primaryKey, tableName, condition);
sb.AppendFormat(
"SELECT * FROM ( SELECT ROW_NUMBER() OVER (order by {0}) AS rows ,{1} FROM {2} where {3}) AS main_temp where rows BETWEEN {4} and {5}",
strOrder, selectedFields, tableName, condition, startRows, endNum);
SqlMapper.GridReader reader = await DapperConnRead.QueryMultipleAsync(sb.ToString());
info.RecordCount = reader.ReadFirst();
List list = reader.Read().AsList();
return list;
}
///
/// 分页查询包含用户信息(仅支持sql server)
/// 查询主表别名为t1,用户表别名为t2,在查询字段需要注意使用t1.xxx格式,xx表示主表字段
/// 用户信息主要有用户账号:Account、昵称:UserName、真实姓名:RealName、头像:HeadIcon、手机号:MobilePhone
/// 输出对象请在Dtos中进行自行封装,不能是使用实体Model类
///
/// 查询条件字段需要加表别名
/// 分页信息
/// 排序字段,也需要加表别名
/// 排序方式
/// 事务
///
public virtual List