WpfApp/Services/DatabaseService.cs

1098 lines
37 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 SqlSugar;
using System.Text.Json;
using WinFormsApp.Utils;
namespace guoke
{
/// <summary>
/// 数据库服务
/// </summary>
public class DatabaseService
{
LogService log;
/// <summary>
/// 数据库配置字典
/// </summary>
static Dictionary<string, DatabaseConfig> dbConf=new Dictionary<string, DatabaseConfig>();
public DatabaseService(LogService logService)
{
//StaticConfig.DynamicExpressionParserType = typeof(DynamicExpressionParser);
log = logService;
List<DatabaseConfig> configs = ConfigReader.GetObject<List<DatabaseConfig>>("DB");
foreach (DatabaseConfig config in configs) {
dbConf.Add(config.Name, config);
}
}
/// <summary>
/// 单例模式对象字段
/// </summary>
static Dictionary<string, SqlSugarScope> SugarScope = new Dictionary<string, SqlSugarScope>();
/// <summary>
/// 获取单例模式对象 可以跨线程
/// </summary>
/// <param name="dbName"></param>
/// <returns></returns>
public SqlSugarScope GetScope(string dbName)
{
if (dbConf.TryGetValue(dbName, out var conf))
{
if (SugarScope.ContainsKey(dbName))//单例模式以创建
{
return SugarScope[dbName];
}
else //创建在返回
{
SqlSugarScope db = new SqlSugarScope(new ConnectionConfig()
{
ConfigId = conf.Name,
ConnectionString = conf.Connection,
DbType = conf.Type,
IsAutoCloseConnection = true,
},
db =>
{
db.Aop.OnLogExecuting = (sql, pars) =>
{
if (conf.Print)
{
var currentDbName = db.CurrentConnectionConfig.ConfigId;
log.Debug($"数据库{currentDbName}", $"sql:{sql}");
}
};
});
db.Ado.CommandTimeOut = 1;//单位秒
SugarScope.Add(dbName, db);//添加到单例字典
return db;
}
}
else
log.Warn("数据库", $"没有{dbName}对应的数据库");
return null;
}
/// <summary>
/// 获取仓库对象 单例模式 可以跨线程
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dbName"></param>
/// <param name="checkTable"></param>
/// <returns></returns>
public WarehouseScope<T> GetWarehouseScope<T>(string dbName, bool checkTable = false) where T : class, IBaseTableModel, new()
{
return new WarehouseScope<T>(log, GetScope(dbName), checkTable);
}
/// <summary>
/// 获取客户端对象 不可以跨线程
/// </summary>
/// <param name="dbName">数据库名称</param>
/// <returns></returns>
public SqlSugarClient GetClient(string dbName)
{
if (dbConf.TryGetValue(dbName, out var conf))
{
SqlSugarClient db= new SqlSugarClient(new ConnectionConfig()
{
ConfigId = conf.Name,
ConnectionString = conf.Connection,
DbType = conf.Type,
IsAutoCloseConnection = true,
},
db =>
{
db.Aop.OnLogExecuting = (sql, pars) =>
{
if (conf.Print)
{
var currentDbName = db.CurrentConnectionConfig.ConfigId;
log.Debug($"数据库{currentDbName}", $"sql:{sql}");
}
};
});
db.Ado.CommandTimeOut = 1;//单位秒
return db;
}
else
log.Warn("数据库", $"没有{dbName}对应的数据库");
return null;
}
/// <summary>
/// 获取仓库客户端对象 不可以跨线程
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dbName"></param>
/// <param name="checkTable"></param>
/// <returns></returns>
public WarehouseClient<T> GetWarehouseClient<T>(string dbName, bool checkTable = false) where T : class, IBaseTableModel, new()
{
return new WarehouseClient<T>(log, GetClient(dbName));
}
/// <summary>
/// 获取仓库
/// </summary>
/// <typeparam name="T">模型类型</typeparam>
/// <param name="db">数据库连接对象</param>
/// <returns></returns>
public Repository<T> GetWarehouse<T>(ISqlSugarClient db, bool checkTable = false) where T : class, IBaseTableModel, new()
{
return new Repository<T>(db, checkTable);
}
/// <summary>
/// 获取仓库
/// </summary>
/// <typeparam name="T">模型类型</typeparam>
/// <param name="dbName">数据库名称</param>
/// <returns></returns>
public Repository<T> GetWarehouse<T>(string dbName, bool checkTable = false) where T : class, IBaseTableModel, new()
{
ISqlSugarClient db = GetClient(dbName);
return new Repository<T>(db, checkTable);
}
/// <summary>
/// 只是方法名称不一样 主要为了用在反射中唯一性
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dbName"></param>
/// <param name="checkTable"></param>
/// <returns></returns>
public Repository<T> GetWarehouseRef<T>(string dbName, bool checkTable = false) where T : class, IBaseTableModel, new()
{
ISqlSugarClient db = GetClient(dbName);
return new Repository<T>(db, checkTable);
}
/// <summary>
/// 获取数据库配置
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public DatabaseConfig GetConfig(string name)
{
if (dbConf.TryGetValue(name, out var conf))
{ return conf; }
else
log.Warn("数据库", $"没有{name}对应的数据库配置");
return null;
}
/// <summary>
/// 根据类型获取表名
/// </summary>
/// <param name="type">模型类型</param>
/// <returns></returns>
public string GetTableName(Type type)
{
object[] attributes = type.GetCustomAttributes(typeof(SugarTable), false);
if (attributes.Length > 0)
{
SugarTable sugarTable = (SugarTable)attributes[0];
return sugarTable.TableName;
}
return type.Name;
}
}
/// <summary>
public class WarehouseBase<T> where T : class, IBaseTableModel, new()
{
//var db = Mode ? (dynamic)Scope : Client;
/// <summary>
/// 获取雪花ID
/// </summary>
public long NextId { get { return SnowFlakeSingle.Instance.NextId(); } }
/// <summary>
/// 模式 true=单例模式 false=客户端模式
/// </summary>
protected bool Mode { get; set; }
/// <summary>
/// 日志服务
/// </summary>
public LogService log { get; set; }
/// <summary>
/// 单例模式实例
/// </summary>
protected SqlSugarScope Scope { get; set; }
/// <summary>
/// 客户端实例
/// </summary>
protected SqlSugarClient Client { get; set; }
/// <summary>
/// 仓储表名
/// </summary>
public string TableName { get; set; }
/// <summary>
/// 连接状态
/// </summary>
public bool ConnStatus{ get {
var db = Mode ? (dynamic)Scope : Client;
return db.Ado.IsValidConnection();
}}
/// <summary>
/// 数据库安全性检查
/// </summary>
/// <returns></returns>
public bool DatabaseSecurityCheck()
{
var db = Mode ? (dynamic)Scope : Client;
if (db == null)
{
LogService.Log.Warn("数据库", "数据库连接对象空");
return true;
}
if (!db.Ado.IsValidConnection())
{
LogService.Log.Warn("数据库", "数据库连接断开");
return true;
}
return false;
}
#region
/// <summary>
/// 检查表
/// </summary>
/// <typeparam name="T"></typeparam>
public bool CheckTable<T>()
{
string tableName = GetTableName(typeof(T));// typeof(T).Name;
if (Mode)
{
return Scope.DbMaintenance.IsAnyTable(tableName);//判断状态表是否存在
}
else
{
return Client.DbMaintenance.IsAnyTable(tableName);//判断状态表是否存在
}
}
/// <summary>
/// 检查表
/// </summary>
/// <param name="tableName"></param>
public bool CheckTable(string tableName)
{
if (Mode)
{
return Scope.DbMaintenance.IsAnyTable(tableName);//判断状态表是否存在
}
else
{
return Client.DbMaintenance.IsAnyTable(tableName);//判断状态表是否存在
}
}
/// <summary>
/// 检查并创建
/// </summary>
/// <typeparam name="T"></typeparam>
public bool CheckToCreate<T>()
{
try
{
string tableName = GetTableName(typeof(T));//获取表名
if (!CheckTable(tableName))
{
if (Mode)
{
if (Scope.MappingTables == null)
{
Scope.MappingTables = new MappingTableList();
}
Scope.MappingTables.Add(typeof(T).Name, tableName); // 类名 表名
Scope.CodeFirst.InitTables(typeof(T)); //创建表
}
else
{
if (Client.MappingTables == null)
{
Client.MappingTables = new MappingTableList();
}
Client.MappingTables.Add(typeof(T).Name, tableName); // 类名 表名
Client.CodeFirst.InitTables(typeof(T)); //创建表
}
log.Info("仓库", $"创建表:{tableName},模型:{typeof(T).Name}");
}
return true;
}
catch (Exception e)
{
log.Error("数据库", $"检查创建表错误:{e.Message}");
return false;
}
}
/// <summary>
/// 根据类型获取表名
/// </summary>
/// <param name="type">模型类型</param>
/// <returns></returns>
public string GetTableName(Type type)
{
object[] attributes = type.GetCustomAttributes(typeof(SugarTable), false);
if (attributes.Length > 0)
{
SugarTable sugarTable = (SugarTable)attributes[0];
return sugarTable.TableName;
}
return type.Name;
}
#endregion
}
/// <summary>
/// 仓储单例模式 可以跨线程
/// </summary>
/// <typeparam name="T"></typeparam>
public class WarehouseScope<T>: WarehouseBase<T> where T : class, IBaseTableModel, new()
{
/// <summary>
/// 数据库对象
/// </summary>
public SqlSugarScope Db{ get;}
/// <summary>
/// 构建仓储
/// </summary>
/// <param name="logService"></param>
/// <param name="db"></param>
/// <param name="checkTable"></param>
public WarehouseScope (LogService logService, SqlSugarScope db, bool checkTable = false)
{
base.Mode = true;
base.Scope = db;
base.log = logService;
this.Db= db;
this.TableName = GetTableName(typeof(T));//获取表名
if (checkTable)
{
CheckToCreate<T>();
}
}
}
/// <summary>
/// 仓储客户端模式 不能跨线程
/// </summary>
/// <typeparam name="T"></typeparam>
public class WarehouseClient<T>: WarehouseBase<T> where T : class, IBaseTableModel, new()
{
/// <summary>
/// 数据库对象
/// </summary>
public SqlSugarClient Db { get; }
/// <summary>
/// 构建仓储
/// </summary>
/// <param name="logService"></param>
/// <param name="db"></param>
/// <param name="checkTable"></param>
public WarehouseClient(LogService logService, SqlSugarClient db, bool checkTable = false)
{
base.Mode = false;
base.Client = db;
base.log = logService;
this.Db = db;
this.TableName = GetTableName(typeof(T));//获取表名
if (checkTable)
{
CheckToCreate<T>();
}
}
}
/// <summary>
/// 创建仓库
/// </summary>
/// <typeparam name="T"></typeparam>
public class Repository<T> : SimpleClient<T> where T : class, IBaseTableModel,new()
{
/// <summary>
/// 获取雪花ID
/// </summary>
public long NextId { get { return SnowFlakeSingle.Instance.NextId(); } }
/// <summary>
///
/// </summary>
private ISqlSugarClient db;
/// <summary>
/// 数据库连接对象
/// </summary>
public ISqlSugarClient Db { get => db;}
/// <summary>
/// 空表名
/// </summary>
private string tableName = "空表名";
/// <summary>
/// 日志
/// </summary>
LogService log;
/// <summary>
/// 创建仓库
/// </summary>
/// <param name="dbClient">数据库连接实例</param>
/// <param name="checkTable">是否创建表</param>
public Repository(ISqlSugarClient dbClient,bool checkTable=false)
{
log = LogService.Log;
base.Context = dbClient;//赋值给基类
db = dbClient;
tableName = GetTableName(typeof(T));//获取表名
if (db.Ado.IsValidConnection())
{
if (checkTable)
{
CheckToCreate<T>();
}
}
else
{
log.Error("仓储", $"{typeof(T).Name}数据库连接不成功");
}
}
/// <summary>
/// 数据库连接状态
/// </summary>
/// <returns></returns>
public bool Connection()
{
return db.Ado.IsValidConnection();
}
#region
/// <summary>
/// 从json字符串中对象中获取所有属性的key
/// </summary>
/// <param name="jsonString">key的数据</param>
/// <returns></returns>
public List<string> GetKeysFromJson(string jsonString)
{
// 将 JSON 字符串解析为字典
var dictionary = JsonSerializer.Deserialize<Dictionary<string, object>>(jsonString);
// 获取所有的键并转换为列表
List<string> keys = new List<string>(dictionary.Keys);
return keys;
}
#endregion
#region
/// <summary>
/// 检查表
/// </summary>
/// <param name="tableName"></param>
public bool CheckTable(string tableName)
{
return Db.DbMaintenance.IsAnyTable(tableName);//判断状态表是否存在
}
/// <summary>
/// 检查表
/// </summary>
/// <typeparam name="T"></typeparam>
public bool CheckTable<T>()
{
string tableName = GetTableName(typeof(T));// typeof(T).Name;
return Db.DbMaintenance.IsAnyTable(tableName);//判断状态表是否存在
}
/// <summary>
/// 检查并创建
/// </summary>
/// <typeparam name="T"></typeparam>
public bool CheckToCreate<T>()
{
try
{
string tableName = GetTableName(typeof(T));//获取表名
if (!Db.DbMaintenance.IsAnyTable(tableName))//判断状态表是否存在
{
if (Db.MappingTables == null)
{
Db.MappingTables = new MappingTableList();
}
Db.MappingTables.Add(typeof(T).Name, tableName); // 类名 表名
Db.CodeFirst.InitTables(typeof(T)); //创建表
log.Info("仓库", $"创建表:{tableName},模型:{typeof(T).Name}");
}
return true;
}
catch (Exception e)
{
return false;
}
}
/// <summary>
/// 根据类型获取表名
/// </summary>
/// <param name="type">模型类型</param>
/// <returns></returns>
string GetTableName(Type type)
{
object[] attributes = type.GetCustomAttributes(typeof(SugarTable), false);
if (attributes.Length > 0)
{
SugarTable sugarTable = (SugarTable)attributes[0];
return sugarTable.TableName;
}
return type.Name;
}
#endregion
#region
/// <summary>
/// 增加数据
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public int Insert( List<T> data)
{
return Db.Insertable(data).ExecuteCommand();
}
#endregion
#region
/// <summary>
/// 存在数据库更新 不存在插入 (默认是主键)
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public int InsertUpdate(T data)
{
return db.Storageable(data).ExecuteCommand();
}
#endregion
#region
/// <summary>
/// 删除指定时间之前的数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="hours"></param>
/// <returns></returns>
public int DeleteDataByHours(int hours)
{
DateTime targetTime = DateTime.Now.AddHours(-hours);// 计算要删除数据的时间点
return db.Deleteable<T>().Where(it => it.CreateTime < targetTime).ExecuteCommand();
}
/// <summary>
/// 删除当前时间指定天数之前的数据
/// </summary>
/// <param name="day"></param>
/// <returns></returns>
public int DeleteDataByDay(int day)
{
DateTime targetTime = DateTime.Now.AddDays(-day);// 计算要删除数据的时间点
return db.Deleteable<T>().Where(it => it.CreateTime < targetTime).ExecuteCommand();
}
/// <summary>
/// 已创建时间保留最新N条数据 其余删除
/// </summary>
/// <param name="N"></param>
/// <returns></returns>
public int ClearTheLatestNItems(int N)
{
return db.Deleteable<T>().In(it => it.Id,db.Queryable<T>().Skip(10).OrderByDescending(it => it.CreateTime)//Take(10)最新10条2个有区别
.Select(it => it.Id)).ExecuteCommand();
}
#endregion
#region
/// <summary>
/// 设置同步状态
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public int SetSyncStatus(T data)
{
data.SyncStatus = 1;
return db.Updateable(data).UpdateColumns(it => new { it.SyncStatus}).ExecuteCommand();
}
#endregion
#region
/// <summary>
/// 查询记录是否存在
/// </summary>
/// <param name="fieldName">字段名称</param>
/// <param name="fieldValue">字段值</param>
/// <param name="conditionalType">条件类型 默认==等于</param>
/// <returns></returns>
public bool Queryable(string fieldName,object fieldValue, string conditionalType="==")
{
return db.Queryable<T>().Where( fieldName, conditionalType, fieldValue).Any();
}
/// <summary>
/// 分页查询
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="pageNumber"></param>
/// <param name="pageSize"></param>
/// <param name="totalNumber"></param>
/// <param name="totalPage"></param>
/// <returns></returns>
public List<T> QueryPage<T>(int pageNumber, int pageSize, ref int totalNumber, ref int totalPage)
{
return db.Queryable<T>().ToPageList(pageNumber, pageSize, ref totalNumber, ref totalPage);
}
/// <summary>
/// 获取未同步的数据10条
/// </summary>
/// <returns></returns>
public List<T> GetUnsynchronizedData()
{
return db.Queryable<T>().Take(10).Where(it=>it.SyncStatus==0).ToList();
}
#endregion
}
/// <summary>
/// 数据库配置模型
/// </summary>
public class DatabaseConfig
{
// 数据库名称
public string Name { get; set; }
// 数据库是否使能
public bool Enabled { get; set; }=false;
// 数据库类型,例如 "SQLServer", "MySQL", "PostgreSQL" 等
public DbType Type { get; set; } = DbType.Sqlite;
// 数据库连接字符串
public string Connection { get; set; }
// 数据库配置备注
public string Remarks { get; set; } = "";
// 是否打印日志等相关信息
public bool Print { get; set; } = false;
}
/// <summary>
/// 数据库基类接口
/// </summary>
public interface IBaseTableModel
{
int Id { get; set; }
DateTime CreateTime { get; set; }
DateTime UpdateTime { get; set; }
string Remarks { get; set; }
int SyncStatus { get; set; }
}
/// <summary>
/// 数据模型基类
/// </summary>
public class BaseTableModel: IBaseTableModel
{
// 主键 ID
[SugarColumn(IsIdentity = true, IsPrimaryKey = true, ColumnDescription = "主键")]//主键标识 自增标识
public int Id { get; set; }
// 创建时间
[SugarColumn(ColumnDescription = "创建时间")]
public DateTime CreateTime { get; set; }= DateTime.Now;
// 更新时间
[SugarColumn(ColumnDescription = "更新时间")]
public DateTime UpdateTime { get; set; } = DateTime.Now;
// 同步状态
[SugarColumn(ColumnDescription = "同步状态")]
public int SyncStatus { get; set; } = 0;
// 备注信息
[SugarColumn(ColumnDescription = "备注信息", IsNullable = true)]
public string Remarks { get; set; } = "";
}
/// <summary>
/// 数据库同步特性
/// </summary>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public class DatabaseSyncAttribute : Attribute
{
/// <summary>
/// 源数据库
/// </summary>
public string Source { get; }
/// <summary>
/// 目标数据库
/// </summary>
public string Target { get; }
/// <summary>
/// 清理使能
/// </summary>
public bool CleanupEnabled { get; set; } = false; // 默认不清理
/// <summary>
/// 清理模式 false 默认保留天数
/// </summary>
public bool CleanupMode { get; set; } = false;
/// <summary>
/// 保留数 CleanupMode=true (保留条数) =false (保留天数) 默认保留30天
/// </summary>
public int RetentionCount { get; set; } = 30;
/// <summary>
/// 数据库同步特性
/// </summary>
/// <param name="source">源数据库</param>
/// <param name="target">目标数据库</param>
/// <param name="cleanupEnabled">源表清理使能</param>
/// <param name="cleanupMode">清理模式 =true保留条数 =false 默认保留天数 </param>
/// <param name="retentionCount">保留数 CleanupMode=true (保留条数) =false (保留天数) 默认保留30天</param>
public DatabaseSyncAttribute(string source, string target,bool cleanupEnabled=false,bool cleanupMode=false,int retentionCount=30)
{
Source = source;
Target = target;
CleanupEnabled = cleanupEnabled;
CleanupMode = cleanupMode;
RetentionCount = retentionCount;
}
}
/// <summary>
/// SqlSugar条件构建器用于简化条件查询的构建
/// </summary>
public class ConditionBuilder
{
private List<IConditionalModel> _conditions = new List<IConditionalModel>();
private Dictionary<string, GroupConditionBuilder> _namedGroups = new Dictionary<string, GroupConditionBuilder>();
/// <summary>
/// 获取构建的条件列表
/// </summary>
public List<IConditionalModel> Build()
{
var result = new List<IConditionalModel>(_conditions);
// 添加所有命名条件组
foreach (var group in _namedGroups.Values)
{
result.Add(group.Build());
}
return result;
}
/// <summary>
/// 添加简单条件
/// </summary>
/// <param name="fieldName">字段名</param>
/// <param name="conditionalType">条件类型</param>
/// <param name="fieldValue">字段值</param>
/// <returns>当前构建器实例</returns>
public ConditionBuilder Where(string fieldName, CondType conditionalType, object fieldValue, string cSharpTypeName=null)
{
_conditions.Add(new ConditionalModel
{
FieldName = fieldName,
ConditionalType =(ConditionalType)conditionalType,
FieldValue = fieldValue?.ToString(),
CSharpTypeName = cSharpTypeName
});
return this;
}
/// <summary>
/// 添加等于条件
/// </summary>
public ConditionBuilder WhereEqual(string fieldName, object fieldValue, string cSharpTypeName = null)
{
return Where(fieldName, CondType.Equal, fieldValue, cSharpTypeName);
}
/// <summary>
/// 添加不等于条件
/// </summary>
public ConditionBuilder WhereNotEqual(string fieldName, object fieldValue, string cSharpTypeName = null)
{
return Where(fieldName, CondType.NoEqual, fieldValue);
}
/// <summary>
/// 添加大于条件
/// </summary>
public ConditionBuilder WhereGreaterThan(string fieldName, object fieldValue, string cSharpTypeName = null)
{
return Where(fieldName, CondType.GreaterThan, fieldValue);
}
/// <summary>
/// 添加大于等于条件
/// </summary>
public ConditionBuilder WhereGreaterThanOrEqual(string fieldName, object fieldValue, string cSharpTypeName = null)
{
return Where(fieldName, CondType.GreaterThanOrEqual, fieldValue, cSharpTypeName);
}
/// <summary>
/// 添加小于条件
/// </summary>
public ConditionBuilder WhereLessThan(string fieldName, object fieldValue, string cSharpTypeName = null)
{
return Where(fieldName, CondType.LessThan, fieldValue, cSharpTypeName);
}
/// <summary>
/// 添加小于等于条件
/// </summary>
public ConditionBuilder WhereLessThanOrEqual(string fieldName, object fieldValue, string cSharpTypeName = null)
{
return Where(fieldName, CondType.LessThanOrEqual, fieldValue, cSharpTypeName);
}
/// <summary>
/// 添加Like条件
/// </summary>
public ConditionBuilder WhereLike(string fieldName, string fieldValue, string cSharpTypeName = null)
{
return Where(fieldName, CondType.Like, fieldValue, cSharpTypeName);
}
/// <summary>
/// 添加In条件
/// </summary>
public ConditionBuilder WhereIn(string fieldName, params object[] values)
{
return Where(fieldName, CondType.In, string.Join(",", values));
}
/// <summary>
/// 添加复杂条件组
/// </summary>
/// <param name="builderAction">条件组构建器委托</param>
/// <returns>当前构建器实例</returns>
public ConditionBuilder WhereGroup(Action<GroupConditionBuilder> builderAction)
{
var groupBuilder = new GroupConditionBuilder();
builderAction(groupBuilder);
_conditions.Add(groupBuilder.Build());
return this;
}
/// <summary>
/// 添加命名的复杂条件组,可以在后续代码中继续添加条件
/// </summary>
/// <param name="groupName">条件组名称</param>
/// <param name="builderAction">条件组构建器委托</param>
/// <returns>当前构建器实例</returns>
public ConditionBuilder WhereGroup(string groupName, Action<GroupConditionBuilder> builderAction)
{
if (!_namedGroups.TryGetValue(groupName, out var groupBuilder))
{
groupBuilder = new GroupConditionBuilder();
_namedGroups.Add(groupName, groupBuilder);
}
builderAction(groupBuilder);
return this;
}
/// <summary>
/// 获取已命名的条件组构建器
/// </summary>
/// <param name="groupName">条件组名称</param>
/// <returns>条件组构建器</returns>
public GroupConditionBuilder GetGroup(string groupName)
{
if (!_namedGroups.TryGetValue(groupName, out var groupBuilder))
{
groupBuilder = new GroupConditionBuilder();
_namedGroups.Add(groupName, groupBuilder);
}
return groupBuilder;
}
}
/// <summary>
/// 条件组构建器,用于构建复杂的条件组
/// </summary>
public class GroupConditionBuilder
{
private List<KeyValuePair<WhereType, ConditionalModel>> _conditionalList = new List<KeyValuePair<WhereType, ConditionalModel>>();
private WhereType _defaultWhereType = WhereType.And;
/// <summary>
/// 设置默认的连接类型And/Or
/// </summary>
public GroupConditionBuilder SetDefaultWhereType(WhereType whereType)
{
_defaultWhereType = whereType;
return this;
}
/// <summary>
/// 构建条件集合
/// </summary>
public ConditionalCollections Build()
{
return new ConditionalCollections
{
ConditionalList = _conditionalList
};
}
/// <summary>
/// 添加条件(使用默认连接类型)
/// </summary>
public GroupConditionBuilder Where(string fieldName, CondType conditionalType, object fieldValue, string cSharpTypeName = null)
{
return Where(_defaultWhereType, fieldName,conditionalType, fieldValue, cSharpTypeName);
}
/// <summary>
/// 添加条件(指定连接类型)
/// </summary>
public GroupConditionBuilder Where(WhereType whereType, string fieldName, CondType conditionalType, object fieldValue, string cSharpTypeName = null)
{
_conditionalList.Add(new KeyValuePair<WhereType, ConditionalModel>(
whereType,
new ConditionalModel
{
FieldName = fieldName,
ConditionalType = (ConditionalType)conditionalType,
FieldValue = fieldValue?.ToString(),
CSharpTypeName = cSharpTypeName
}
));
return this;
}
/// <summary>
/// 添加And连接的条件
/// </summary>
public GroupConditionBuilder And(string fieldName, CondType conditionalType, object fieldValue, string cSharpTypeName = null)
{
return Where(WhereType.And, fieldName, conditionalType, fieldValue, cSharpTypeName);
}
/// <summary>
/// 添加Or连接的条件
/// </summary>
public GroupConditionBuilder Or(string fieldName, CondType conditionalType, object fieldValue, string cSharpTypeName = null)
{
return Where(WhereType.Or, fieldName, conditionalType, fieldValue, cSharpTypeName);
}
/// <summary>
/// 添加And连接的等于条件
/// </summary>
public GroupConditionBuilder AndEqual(string fieldName, object fieldValue, string cSharpTypeName = null)
{
return And(fieldName, CondType.Equal, fieldValue, cSharpTypeName);
}
/// <summary>
/// 添加Or连接的等于条件
/// </summary>
public GroupConditionBuilder OrEqual(string fieldName, object fieldValue, string cSharpTypeName = null)
{
return Or(fieldName, CondType.Equal, fieldValue, cSharpTypeName);
}
/// <summary>
/// 添加And连接的不等于条件
/// </summary>
public GroupConditionBuilder AndNotEqual(string fieldName, object fieldValue, string cSharpTypeName = null)
{
return And(fieldName, CondType.NoEqual, fieldValue, cSharpTypeName);
}
/// <summary>
/// 添加Or连接的不等于条件
/// </summary>
public GroupConditionBuilder OrNotEqual(string fieldName, object fieldValue, string cSharpTypeName = null)
{
return Or(fieldName, CondType.NoEqual, fieldValue, cSharpTypeName);
}
/// <summary>
/// 添加And连接的Like条件
/// </summary>
public GroupConditionBuilder AndLike(string fieldName, string fieldValue, string cSharpTypeName = null)
{
return And(fieldName, CondType.Like, fieldValue, cSharpTypeName);
}
/// <summary>
/// 添加Or连接的Like条件
/// </summary>
public GroupConditionBuilder OrLike(string fieldName, string fieldValue, string cSharpTypeName = null)
{
return Or(fieldName, CondType.Like, fieldValue, cSharpTypeName);
}
// 可以根据需要添加更多便捷方法
}
/// <summary>
/// 条件类型枚举
/// </summary>
public enum CondType
{
/// <summary>
/// 等于条件,用于判断字段值是否等于指定值
/// </summary>
Equal,
/// <summary>
/// 模糊匹配,相当于 SQL 中的 LIKE '%value%'
/// </summary>
Like,
/// <summary>
/// 大于条件,相当于 SQL 中的 >
/// </summary>
GreaterThan,
/// <summary>
/// 大于等于条件,相当于 SQL 中的 >=
/// </summary>
GreaterThanOrEqual,
/// <summary>
/// 小于条件,相当于 SQL 中的 <
/// </summary>
LessThan,
/// <summary>
/// 小于等于条件,相当于 SQL 中的 <=
/// </summary>
LessThanOrEqual,
/// <summary>
/// 包含条件,相当于 SQL 中的 IN
/// </summary>
In,
/// <summary>
/// 不包含条件,相当于 SQL 中的 NOT IN
/// </summary>
NotIn,
/// <summary>
/// 左模糊匹配,相当于 SQL 中的 LIKE '%value'
/// </summary>
LikeLeft,
/// <summary>
/// 右模糊匹配,相当于 SQL 中的 LIKE 'value%'
/// </summary>
LikeRight,
/// <summary>
/// 不等于条件,相当于 SQL 中的 != 或 <>
/// </summary>
NoEqual,
/// <summary>
/// 判断字段是否为 null 或空
/// </summary>
IsNullOrEmpty,
/// <summary>
/// 不是条件,用于否定判断
/// </summary>
IsNot,
/// <summary>
/// 不包含,相当于 SQL 中的 NOT LIKE
/// </summary>
NoLike,
/// <summary>
/// 等于 null 条件
/// </summary>
EqualNull,
/// <summary>
/// 包含模糊匹配,可以进行多个值的模糊查询
/// </summary>
InLike,
/// <summary>
/// 范围查询,用于指定一个值的范围
/// </summary>
Range
}
}