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 : DataBase, IRepositoryBase where TEntity : class, new() public class RepositoryBase : IRepositoryBase where TEntity : class, new() { public bool isHaveErr; public string ErrMsg = ""; public string filterName = "SubSystemName"; ~RepositoryBase() { DBSync.ReSetCrudDb(); } public RepositoryBase() { } /// /// 是否优先使用本地数据库 /// public bool IsUseLoaclDB = false; #region 数据库操作 泛型抽象方法 #region 优先查询 主数据库 /// /// 无状态数据操作(查询)泛型抽象方法 /// /// /// /// /// public virtual T SyncExecuteRead(Func 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()} "); } } /// /// 无状态数据操作(查询)泛型抽象方法 /// /// /// /// /// public virtual T SyncExecuteRead(Func, T> func) { var syncSqlConfig = DBSync.GetSyncSqlConfig(); // 基类获取数据库配置 if (IsUseLoaclDB) { var secondaryDB = syncSqlConfig.GetSecondaryDB().GetSimpleClient(); return func.Invoke(secondaryDB); // 尝试查询本地数据库 } if (syncSqlConfig.GetNetworkState()) // 网络检测 { try { var primaryDB = syncSqlConfig.GetPrimaryDB()?.GetSimpleClient(); 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(); return func.Invoke(secondaryDB); // 尝试查询本地数据库 } catch { throw new DBSyncException(DBSyncExType.CrudError, $"主从数据库不可用。\r\n {syncSqlConfig.ToString()} "); } } #endregion #region 优先查询 从数据库 (已注释) /* /// /// 无状态数据操作(查询)泛型抽象方法 /// /// /// /// /// public virtual T ExecuteSyncOperation(Func 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()} "); } } } /// /// 无状态数据操作(查询)泛型抽象方法 /// /// /// /// /// public virtual T ExecuteSyncOperation(Func, T> func) { DBSync.SyncEvent.Wait(); var secondaryDB = SyncSqlConfig.GetSecondaryDB().GetSimpleClient(); try { return func.Invoke(secondaryDB); // 优先尝试查询本地数据库 } catch { // 本地数据库查询失败,尝试远程数据库 try { var primaryDB = SyncSqlConfig.GetPrimaryDB()?.GetSimpleClient(); 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 增加、更新、删除 操作泛型方法 /// /// 有状态数据操作(更新、增加、删除)泛型抽象方法,优先操作本地数据库,操作远程数据库失败时调用DBSync.SetIsNeedSyncData(true); /// /// /// /// /// /// public virtual T SyncExecuteCUD(Func 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(Func, T> func) { var syncSqlConfig = DBSync.GetSyncSqlConfig(); // 基类获取数据库配置 var secondaryDB = syncSqlConfig.GetSecondaryDB().GetSimpleClient(); try { var secondaryResult = func.Invoke(secondaryDB); // 本地数据库操作 if (IsUseLoaclDB) { return secondaryResult; } if (syncSqlConfig.GetNetworkState()) // 网络检测 { var primaryDB = syncSqlConfig.GetPrimaryDB().GetSimpleClient(); 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 func) { return SyncExecuteRead(func); } public bool SyncRead(Func func) { return SyncExecuteRead(func); } public List SyncRead(Func> func) { return SyncExecuteRead(func); } /// /// 查询返回实体 /// public TEntity SyncRead(Func, TEntity> func) { return SyncExecuteRead(func); } /// /// 查询返回实体列表 /// public List SyncRead(Func, List> func) { return SyncExecuteRead(func); } public TEntity SyncCUD(Func func) { return SyncExecuteCUD(func); } public int SyncCUD(Func func) { return SyncExecuteCUD(func); } public bool SyncCUD(Func func) { return SyncExecuteCUD(func); } public TEntity SyncSimpleCUD(Func, TEntity> func) { return SyncExecuteCUD(func); } public int SyncSimpleCUD(Func, int> func) { return SyncExecuteCUD(func); } public bool SyncSimpleCUD(Func, bool> func) { return SyncExecuteCUD(func); } #endregion public virtual TEntity GetModelByID(dynamic ID) { return SyncRead(db => db.GetById(ID)); } public virtual TEntity GetModel(Expression> where) { try { return SyncRead(db => db.Queryable().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> where) { try { return SyncRead(db => db.Queryable().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> 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().RemoveDataCache().ExecuteCommand()); return SyncSimpleCUD(db => (bool)db.DeleteById(ID)); } public virtual bool Delete(Expression> where) { return SyncSimpleCUD(db => db.Delete(where)); } public virtual string GetPageList(Pagination pagination, Expression> 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> expression) { //DatabaseSync.StartcaControls(); return SyncRead(db => db.Queryable().Filter(filterName, isDisabledGobalFilter: true).Single(expression)); } public virtual List GetTop(int Top, Expression> expression, OrderByType _OrderByType = OrderByType.Asc, Expression> where = null, string selstr = "*") { return SyncRead(db => db.Queryable().Select(selstr).WhereIF(where != null, where) .Take(Top) .OrderBy(expression, _OrderByType) .Filter(filterName, isDisabledGobalFilter: true) .ToList()); } /// /// 排序表达式所用的键,排序方式,搜索条件 /// /// /// /// /// public virtual TEntity GetFirst(Expression> OrderExpression, OrderByType _OrderByType = OrderByType.Asc, Expression> where = null) { return SyncRead(db => db.Queryable().Filter(filterName, isDisabledGobalFilter: true).WhereIF(where != null, where) .OrderBy(OrderExpression, _OrderByType) .First()); } public virtual List GetList(Pagination pagination, Expression> where = null) { int totalNumber = 0; List result = SyncRead(db => db.Queryable().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 GetList(Expression> where = null) { return SyncRead(db => db.Queryable().WhereIF(where != null, where).Filter(filterName, isDisabledGobalFilter: true) .ToList()); } public virtual List GetList() { return SyncRead(db => db.Queryable().ToList()); } public virtual DataTable GetDataTable(Expression> 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(); } public virtual TEntity GetModelByID(dynamic ID) { return Sclient.GetById(ID); } public virtual TEntity GetModel(Expression> 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> where) { return db.Queryable().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> expression) { return db.Updateable(model).UpdateColumns(expression).ExecuteCommand(); } public virtual bool DeleteByID(dynamic ID) { db.Updateable().RemoveDataCache().ExecuteCommand(); return Sclient.DeleteById(ID); } public virtual bool Delete(Expression> where) { return Sclient.Delete(where); } public virtual string GetPageList(Pagination pagination, Expression> where = null) { return new { rows = GetList(pagination, where), total = pagination.total, page = pagination.page, records = pagination.records }.ToJson(); } public virtual TEntity GetSingle(Expression> expression) { return db.Queryable().Filter(filterName, isDisabledGobalFilter: true).Single(expression); } public virtual List GetTop(int Top, Expression> expression, OrderByType _OrderByType = OrderByType.Asc, Expression> where = null, string selstr = "*") { return db.Queryable().Select(selstr).WhereIF(where != null, where) .Take(Top) .OrderBy(expression, _OrderByType) .Filter(filterName, isDisabledGobalFilter: true) .ToList(); } public virtual TEntity GetFirst(Expression> OrderExpression, OrderByType _OrderByType = OrderByType.Asc, Expression> where = null) { return db.Queryable().Filter(filterName, isDisabledGobalFilter: true).WhereIF(where != null, where) .OrderBy(OrderExpression, _OrderByType) .First(); } public virtual List GetList(Pagination pagination, Expression> where = null) { int totalNumber = 0; List result = db.Queryable().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 GetList(Expression> where = null) { return db.Queryable().WhereIF(where != null, where).Filter(filterName, isDisabledGobalFilter: true) .ToList(); } public virtual List GetList() { return db.Queryable().ToList(); } public virtual DataTable GetDataTable(Expression> 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 { /// /// 每页行数 /// public int rows { get; set; } /// /// 当前页 /// public int page { get; set; } /// /// /排序列 /// public string sidx { get; set; } /// /// 排序类型 /// public string sord { get; set; } /// /// 总记录数 /// public int records { get; set; } /// /// 总页数 /// public int total { get { if (records > 0) { if (records % rows != 0) { return records / rows + 1; } return records / rows; } return 0; } } } }