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

878 lines
27 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
return null;
}
}
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));
}
public virtual string GetPageList(Pagination pagination, Expression<Func<TEntity, bool>> where = null)
{
//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));
}
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 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>
public virtual TEntity GetFirst(Expression<Func<TEntity, object>> OrderExpression, OrderByType _OrderByType = OrderByType.Asc, Expression<Func<TEntity, bool>> where = null)
{
return SyncRead(db => 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 = 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;
}
public virtual List<TEntity> GetList(Expression<Func<TEntity, bool>> where = null)
{
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());
}
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)
{
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;
});
filterName = null;
}
/* 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>
public string sidx { get; set; }
/// <summary>
/// 排序类型
/// </summary>
public string sord { get; set; }
/// <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;
}
}
}
}