Files
serein-flow/Library.Core/DbSql/RepositoryBase.cs

878 lines
27 KiB
C#
Raw Normal View History

2024-08-05 10:11:58 +08:00

using Serein.DbSql;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json;
using SqlSugar;
using System.Data;
using System.Linq.Expressions;
using Serein.Tool;
namespace Serein.Helper
{
// public class RepositoryBase<TEntity> : DataBase, IRepositoryBase<TEntity> where TEntity : class, new()
public class RepositoryBase<TEntity> : IRepositoryBase<TEntity> where TEntity : class, new()
{
public bool isHaveErr;
public string ErrMsg = "";
public string filterName = "SubSystemName";
~RepositoryBase()
{
DBSync.ReSetCrudDb();
}
public RepositoryBase()
{
}
/// <summary>
/// 是否优先使用本地数据库
/// </summary>
public bool IsUseLoaclDB = false;
#region
#region
/// <summary>
/// 无状态数据操作(查询)泛型抽象方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="func"></param>
/// <returns></returns>
/// <exception cref="DBSyncException"></exception>
public virtual T SyncExecuteRead<T>(Func<SqlSugarClient, T> func)
{
var syncSqlConfig = DBSync.GetSyncSqlConfig(); // 基类获取数据库配置
if (IsUseLoaclDB)
{
var secondaryDB = syncSqlConfig.GetSecondaryDB();
return func.Invoke(secondaryDB); // 尝试查询本地数据库
}
if (syncSqlConfig.GetNetworkState()) // 网络检测
{
try
{
var primaryDB = syncSqlConfig.GetPrimaryDB();
if (primaryDB != null)
{
return func.Invoke(primaryDB); // 尝试查询本地数据库
}
else
{
Console.WriteLine("远程数据库不可用");
}
}
catch(Exception ex)
{
DBSync.SetIsNeedSyncData(true); // 网络不可达
Console.WriteLine(ex.ToString());
}
}
try
{
var secondaryDB = syncSqlConfig.GetSecondaryDB();
return func.Invoke(secondaryDB); // 尝试查询本地数据库
}
catch
{
throw new DBSyncException(DBSyncExType.CrudError, $"主从数据库不可用。\r\n {syncSqlConfig.ToString()} ");
}
}
/// <summary>
/// 无状态数据操作(查询)泛型抽象方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="func"></param>
/// <returns></returns>
/// <exception cref="DBSyncException"></exception>
public virtual T SyncExecuteRead<T>(Func<SimpleClient<TEntity>, T> func)
{
var syncSqlConfig = DBSync.GetSyncSqlConfig(); // 基类获取数据库配置
if (IsUseLoaclDB)
{
var secondaryDB = syncSqlConfig.GetSecondaryDB().GetSimpleClient<TEntity>();
return func.Invoke(secondaryDB); // 尝试查询本地数据库
}
if (syncSqlConfig.GetNetworkState()) // 网络检测
{
try
{
var primaryDB = syncSqlConfig.GetPrimaryDB()?.GetSimpleClient<TEntity>();
if (primaryDB != null)
{
return func.Invoke(primaryDB); // 尝试查询远程数据库
}
else
{
Console.WriteLine("远程数据库不可用");
}
}
catch (Exception ex)
{
DBSync.SetIsNeedSyncData(true); // 网络不可达
Console.WriteLine(ex.ToString());
}
}
try
{
var secondaryDB = syncSqlConfig.GetSecondaryDB().GetSimpleClient<TEntity>();
return func.Invoke(secondaryDB); // 尝试查询本地数据库
}
catch
{
throw new DBSyncException(DBSyncExType.CrudError, $"主从数据库不可用。\r\n {syncSqlConfig.ToString()} ");
}
}
#endregion
#region
/* /// <summary>
/// 无状态数据操作(查询)泛型抽象方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="func"></param>
/// <returns></returns>
/// <exception cref="DBSyncException"></exception>
public virtual T ExecuteSyncOperation<T>(Func<SqlSugarClient, T> func)
{
DBSync.SyncEvent.Wait();
var secondaryDB = SyncSqlConfig.GetSecondaryDB();
try
{
return func.Invoke(secondaryDB); // 优先尝试查询本地数据库
}
catch
{
try
{
var primaryDB = SyncSqlConfig.GetPrimaryDB();
if (primaryDB != null)
{
if (SyncSqlConfig.GetNetworkState()) // 网络检测
{
DBSync.SyncEvent.Wait();
return func.Invoke(primaryDB); // 尝试查询远程数据库
}
else
{
throw new DBSyncException(DBSyncExType.CrudError, "网络不可达,无法查询远程数据库。");
}
}
else
{
throw new DBSyncException(DBSyncExType.CrudError, "远程数据库不可用。");
}
}
catch
{
throw new DBSyncException(DBSyncExType.CrudError, $"远程数据库查询失败。\r\n {SyncSqlConfig.ToString()} ");
}
}
}
/// <summary>
/// 无状态数据操作(查询)泛型抽象方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="func"></param>
/// <returns></returns>
/// <exception cref="DBSyncException"></exception>
public virtual T ExecuteSyncOperation<T>(Func<SimpleClient<TEntity>, T> func)
{
DBSync.SyncEvent.Wait();
var secondaryDB = SyncSqlConfig.GetSecondaryDB().GetSimpleClient<TEntity>();
try
{
return func.Invoke(secondaryDB); // 优先尝试查询本地数据库
}
catch
{
// 本地数据库查询失败,尝试远程数据库
try
{
var primaryDB = SyncSqlConfig.GetPrimaryDB()?.GetSimpleClient<TEntity>();
if (primaryDB != null)
{
if (SyncSqlConfig.GetNetworkState()) // 网络检测
{
DBSync.SyncEvent.Wait();
return func.Invoke(primaryDB); // 尝试查询远程数据库
}
else
{
throw new DBSyncException(DBSyncExType.CrudError, "网络不可达,无法查询远程数据库。");
}
}
else
{
throw new DBSyncException(DBSyncExType.CrudError, "远程数据库不可用。");
}
}
catch
{
throw new DBSyncException(DBSyncExType.CrudError, $"远程数据库查询失败。\r\n {SyncSqlConfig.ToString()} ");
}
}
}
*/
#endregion
#region
/// <summary>
/// 有状态数据操作更新、增加、删除泛型抽象方法优先操作本地数据库操作远程数据库失败时调用DBSync.SetIsNeedSyncData(true);
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <param name="primaryFunc"></param>
/// <param name="secondaryFunc"></param>
/// <returns></returns>
/// <exception cref="DBSyncException"></exception>
public virtual T SyncExecuteCUD<T>(Func<SqlSugarClient, T> func)
{
var syncSqlConfig = DBSync.GetSyncSqlConfig(); // 基类获取数据库配置
var secondaryDB = syncSqlConfig.GetSecondaryDB();
try
{
var secondaryResult = func.Invoke(secondaryDB); // 本地数据库操作
if (IsUseLoaclDB)
{
return secondaryResult;
}
if (syncSqlConfig.GetNetworkState()) // 网络检测
{
var primaryDB = syncSqlConfig.GetPrimaryDB();
if(primaryDB != null)
{
var primaryResult = func.Invoke(primaryDB); // 远程数据库操作
return primaryResult;
}
else
{
Console.WriteLine("远程数据库不可用");
}
}
return secondaryResult;
}
catch (Exception ex)
{
Console.WriteLine("主从数据库不可用:" + ex.ToString());
DBSync.SetIsNeedSyncData(true);
throw new DBSyncException(DBSyncExType.CrudError, $"主从数据库不可用。\r\n {syncSqlConfig.ToString()} ");
}
}
public virtual T SyncExecuteCUD<T>(Func<SimpleClient<TEntity>, T> func)
{
var syncSqlConfig = DBSync.GetSyncSqlConfig(); // 基类获取数据库配置
var secondaryDB = syncSqlConfig.GetSecondaryDB().GetSimpleClient<TEntity>();
try
{
var secondaryResult = func.Invoke(secondaryDB); // 本地数据库操作
if (IsUseLoaclDB)
{
return secondaryResult;
}
if (syncSqlConfig.GetNetworkState()) // 网络检测
{
var primaryDB = syncSqlConfig.GetPrimaryDB().GetSimpleClient<TEntity>();
if(primaryDB != null)
{
var primaryResult = func.Invoke(primaryDB); // 远程数据库操作
return primaryResult;
}
else
{
Console.WriteLine("远程数据库不可用");
}
}
return secondaryResult;
}
catch (Exception ex)
{
Console.WriteLine("主从数据库不可用:" + ex.ToString());
DBSync.SetIsNeedSyncData(true);
throw new DBSyncException(DBSyncExType.CrudError, $"主从数据库不可用。\r\n {syncSqlConfig.ToString()} ");
}
}
#endregion
public TEntity SyncRead(Func<SqlSugarClient, TEntity> func)
{
return SyncExecuteRead(func);
}
public bool SyncRead(Func<SqlSugarClient, bool> func)
{
return SyncExecuteRead(func);
}
public List<T> SyncRead<T>(Func<SqlSugarClient, List<T>> func)
{
return SyncExecuteRead(func);
}
/// <summary>
/// 查询返回实体
/// </summary>
public TEntity SyncRead(Func<SimpleClient<TEntity>, TEntity> func)
{
return SyncExecuteRead(func);
}
/// <summary>
/// 查询返回实体列表
/// </summary>
public List<T> SyncRead<T>(Func<SimpleClient<TEntity>, List<T>> func)
{
return SyncExecuteRead(func);
}
public TEntity SyncCUD(Func<SqlSugarClient, TEntity> func)
{
return SyncExecuteCUD(func);
}
public int SyncCUD(Func<SqlSugarClient, int> func)
{
return SyncExecuteCUD(func);
}
public bool SyncCUD(Func<SqlSugarClient, bool> func)
{
return SyncExecuteCUD(func);
}
public TEntity SyncSimpleCUD(Func<SimpleClient<TEntity>, TEntity> func)
{
return SyncExecuteCUD(func);
}
public int SyncSimpleCUD(Func<SimpleClient<TEntity>, int> func)
{
return SyncExecuteCUD(func);
}
public bool SyncSimpleCUD(Func<SimpleClient<TEntity>, bool> func)
{
return SyncExecuteCUD(func);
}
#endregion
public virtual TEntity GetModelByID(dynamic ID)
{
return SyncRead(db => db.GetById(ID));
}
public virtual TEntity GetModel(Expression<Func<TEntity, bool>> where)
{
try
{
return SyncRead(db => db.Queryable<TEntity>().Where(where).First()); //db.GetSingle(where));
// GetSingle结果不能大于1
}
catch (Exception ex)
{
isHaveErr = true;
ErrMsg = ex.Message;
2024-08-05 10:11:58 +08:00
return null;
2024-08-05 10:11:58 +08:00
}
}
public virtual int Add(TEntity model)
{
try
{
return SyncCUD(db => db.Insertable(model).ExecuteCommand());
}
catch (Exception ex)
{
isHaveErr = true;
ErrMsg = ex.Message;
return 0;
}
}
public virtual int AddAndReturnIndex(TEntity model)
{
try
{
return SyncCUD(db => db.Insertable(model).ExecuteReturnIdentity());
}
catch (Exception ex)
{
isHaveErr = true;
ErrMsg = ex.Message;
return 0;
}
}
public virtual bool Exist(Expression<Func<TEntity, bool>> where)
{
try
{
return SyncRead(db => db.Queryable<TEntity>().Where(where).Take(1).Any());
}
catch (Exception ex)
{
isHaveErr = true;
ErrMsg = ex.Message;
return false;
}
}
public int AddOrUpdate(TEntity model, string keyValue)
{
if (keyValue == "")
{
try
{
return SyncCUD(db => db.Insertable(model).ExecuteCommand());
}
catch (Exception ex)
{
isHaveErr = true;
ErrMsg = ex.Message;
return 0;
}
}
return SyncCUD(db => db.Updateable(model).ExecuteCommand());
}
public virtual int Update(TEntity model)
{
return SyncCUD(db => db.Updateable(model).ExecuteCommand());
}
public virtual int UpdateColumns(TEntity model, Expression<Func<TEntity, object>> expression)
{
//DatabaseSync.StartcaControls();
try
{
return SyncCUD(db => db.Updateable(model).UpdateColumns(expression).ExecuteCommand());
}
catch (Exception ex)
{
isHaveErr = true;
ErrMsg = ex.Message;
return 0;
}
}
public virtual bool DeleteByID(dynamic ID)
{
//SyncCUD(db => db.Updateable<TEntity>().RemoveDataCache().ExecuteCommand());
return SyncSimpleCUD(db => (bool)db.DeleteById(ID));
}
public virtual bool Delete(Expression<Func<TEntity, bool>> where)
{
return SyncSimpleCUD(db => db.Delete(where));
}
2024-08-05 10:11:58 +08:00
public virtual string GetPageList(Pagination pagination, Expression<Func<TEntity, bool>> where = null)
2024-08-05 10:11:58 +08:00
{
//DatabaseSync.StartcaControls();
return new
{
rows = GetList(pagination, where),
total = pagination.total,
page = pagination.page,
records = pagination.records
}.ToJson();
}
public virtual TEntity GetSingle(Expression<Func<TEntity, bool>> expression)
{
//DatabaseSync.StartcaControls();
return SyncRead(db => db.Queryable<TEntity>().Filter(filterName, isDisabledGobalFilter: true).Single(expression));
}
2024-08-05 10:11:58 +08:00
public virtual List<TEntity> GetTop(int Top, Expression<Func<TEntity, object>> expression, OrderByType _OrderByType = OrderByType.Asc, Expression<Func<TEntity, bool>> where = null, string selstr = "*")
2024-08-05 10:11:58 +08:00
{
return SyncRead(db => db.Queryable<TEntity>().Select(selstr).WhereIF(where != null, where)
.Take(Top)
.OrderBy(expression, _OrderByType)
.Filter(filterName, isDisabledGobalFilter: true)
.ToList());
}
/// <summary>
/// 排序表达式所用的键,排序方式,搜索条件
/// </summary>
/// <param name="OrderExpression"></param>
/// <param name="_OrderByType"></param>
/// <param name="where"></param>
/// <returns></returns>
2024-08-05 10:11:58 +08:00
public virtual TEntity GetFirst(Expression<Func<TEntity, object>> OrderExpression, OrderByType _OrderByType = OrderByType.Asc, Expression<Func<TEntity, bool>> where = null)
2024-08-05 10:11:58 +08:00
{
return SyncRead(db => db.Queryable<TEntity>().Filter(filterName, isDisabledGobalFilter: true).WhereIF(where != null, where)
.OrderBy(OrderExpression, _OrderByType)
.First());
}
2024-08-05 10:11:58 +08:00
public virtual List<TEntity> GetList(Pagination pagination, Expression<Func<TEntity, bool>> where = null)
2024-08-05 10:11:58 +08:00
{
int totalNumber = 0;
List<TEntity> result = SyncRead(db => db.Queryable<TEntity>().WhereIF(where != null, where).OrderBy(pagination.sidx + " " + pagination.sord)
.Filter(filterName, isDisabledGobalFilter: true)
.ToPageList(pagination.page, pagination.rows, ref totalNumber));
pagination.records = totalNumber;
return result;
}
2024-08-05 10:11:58 +08:00
public virtual List<TEntity> GetList(Expression<Func<TEntity, bool>> where = null)
2024-08-05 10:11:58 +08:00
{
return SyncRead(db => db.Queryable<TEntity>().WhereIF(where != null, where).Filter(filterName, isDisabledGobalFilter: true)
.ToList());
}
public virtual List<TEntity> GetList()
{
return SyncRead(db => db.Queryable<TEntity>().ToList());
}
2024-08-05 10:11:58 +08:00
public virtual DataTable GetDataTable(Expression<Func<TEntity, bool>> where = null, Pagination pagination = null)
2024-08-05 10:11:58 +08:00
{
if (pagination != null)
{
return DataHelper.ListToDataTable(GetList(pagination, where));
}
return DataHelper.ListToDataTable(GetList(where));
}
public virtual void UseFilter(SqlFilterItem item)
{
SyncCUD(db =>
{
db.QueryFilter.Remove(item.FilterName);
db.QueryFilter.Add(item);
return 0;
});
filterName = item.FilterName;
}
public virtual void ClearFilter()
{
SyncCUD(db =>
{
db.QueryFilter.Clear();
return 0;
});
2024-08-05 10:11:58 +08:00
filterName = null;
2024-08-05 10:11:58 +08:00
}
/* public void ReSetConnStr(string constr, SqlSugar.DbType _dbtype)
{
db = DBHelper.CreateDB(constr, _dbtype);
Sclient = db.GetSimpleClient<TEntity>();
}
public virtual TEntity GetModelByID(dynamic ID)
{
return Sclient.GetById(ID);
}
public virtual TEntity GetModel(Expression<Func<TEntity, bool>> where)
{
try
{
return Sclient.GetSingle(where);
}
catch (Exception ex)
{
isHaveErr = true;
ErrMsg = ex.Message;
return null;
}
}
public virtual int Add(TEntity model)
{
try
{
return db.Insertable(model).ExecuteCommand();
}
catch (Exception ex)
{
isHaveErr = true;
ErrMsg = ex.Message;
return 0;
}
}
public virtual int AddAndReturnIndex(TEntity model)
{
try
{
return db.Insertable(model).ExecuteReturnIdentity();
}
catch (Exception ex)
{
isHaveErr = true;
ErrMsg = ex.Message;
return 0;
}
}
public virtual bool Exist(Expression<Func<TEntity, bool>> where)
{
return db.Queryable<TEntity>().Where(where).Take(1).Any();
}
public int AddOrUpdate(TEntity model, string Keyvale)
{
if (Keyvale == "")
{
return db.Insertable(model).ExecuteCommand();
}
return db.Updateable(model).ExecuteCommand();
}
public virtual int Update(TEntity model)
{
return db.Updateable(model).ExecuteCommand();
}
public virtual int UpdateColumns(TEntity model, Expression<Func<TEntity, object>> expression)
{
return db.Updateable(model).UpdateColumns(expression).ExecuteCommand();
}
public virtual bool DeleteByID(dynamic ID)
{
db.Updateable<TEntity>().RemoveDataCache().ExecuteCommand();
return Sclient.DeleteById(ID);
}
public virtual bool Delete(Expression<Func<TEntity, bool>> where)
{
return Sclient.Delete(where);
}
public virtual string GetPageList(Pagination pagination, Expression<Func<TEntity, bool>> where = null)
{
return new
{
rows = GetList(pagination, where),
total = pagination.total,
page = pagination.page,
records = pagination.records
}.ToJson();
}
public virtual TEntity GetSingle(Expression<Func<TEntity, bool>> expression)
{
return db.Queryable<TEntity>().Filter(filterName, isDisabledGobalFilter: true).Single(expression);
}
public virtual List<TEntity> GetTop(int Top, Expression<Func<TEntity, object>> expression, OrderByType _OrderByType = OrderByType.Asc, Expression<Func<TEntity, bool>> where = null, string selstr = "*")
{
return db.Queryable<TEntity>().Select(selstr).WhereIF(where != null, where)
.Take(Top)
.OrderBy(expression, _OrderByType)
.Filter(filterName, isDisabledGobalFilter: true)
.ToList();
}
public virtual TEntity GetFirst(Expression<Func<TEntity, object>> OrderExpression, OrderByType _OrderByType = OrderByType.Asc, Expression<Func<TEntity, bool>> where = null)
{
return db.Queryable<TEntity>().Filter(filterName, isDisabledGobalFilter: true).WhereIF(where != null, where)
.OrderBy(OrderExpression, _OrderByType)
.First();
}
public virtual List<TEntity> GetList(Pagination pagination, Expression<Func<TEntity, bool>> where = null)
{
int totalNumber = 0;
List<TEntity> result = db.Queryable<TEntity>().WhereIF(where != null, where).OrderBy(pagination.sidx + " " + pagination.sord)
.Filter(filterName, isDisabledGobalFilter: true)
.ToPageList(pagination.page, pagination.rows, ref totalNumber);
pagination.records = totalNumber;
return result;
}
public virtual List<TEntity> GetList(Expression<Func<TEntity, bool>> where = null)
{
return db.Queryable<TEntity>().WhereIF(where != null, where).Filter(filterName, isDisabledGobalFilter: true)
.ToList();
}
public virtual List<TEntity> GetList()
{
return db.Queryable<TEntity>().ToList();
}
public virtual DataTable GetDataTable(Expression<Func<TEntity, bool>> where = null, Pagination pagination = null)
{
if (pagination != null)
{
return DataHelper.ListToDataTable(GetList(pagination, where));
}
return DataHelper.ListToDataTable(GetList(where));
}
public virtual void UseFilter(SqlFilterItem item)
{
db.QueryFilter.Remove(item.FilterName);
db.QueryFilter.Add(item);
filterName = item.FilterName;
}
public virtual void ClearFilter()
{
db.QueryFilter.Clear();
filterName = null;
}
public void BeginTran()
{
db.Ado.BeginTran();
}
public void CommitTran()
{
db.Ado.CommitTran();
}
public void RollbackTran()
{
db.Ado.RollbackTran();
}*/
}
public class Pagination
{
/// <summary>
/// 每页行数
/// </summary>
public int rows { get; set; }
/// <summary>
/// 当前页
/// </summary>
public int page { get; set; }
/// <summary>
/// /排序列
/// </summary>
2024-08-05 10:11:58 +08:00
public string sidx { get; set; }
2024-08-05 10:11:58 +08:00
/// <summary>
/// 排序类型
/// </summary>
2024-08-05 10:11:58 +08:00
public string sord { get; set; }
2024-08-05 10:11:58 +08:00
/// <summary>
/// 总记录数
/// </summary>
public int records { get; set; }
/// <summary>
/// 总页数
/// </summary>
public int total
{
get
{
if (records > 0)
{
if (records % rows != 0)
{
return records / rows + 1;
}
return records / rows;
}
return 0;
}
}
}
}