diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 0c0bbd01..f6502a75 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1104,6 +1104,82 @@ + + + 动态创建实体类型 + + + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性默认值 + 属性标记的特性-支持多个 + + + + + 配置父类 + + 父类类型 + + + + + Override属性 + + + + + + Emit动态创建出Class - Type + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -1598,6 +1674,13 @@ 是否标识为NOT + + + 动态过滤条件 + + + + 禁用全局过滤功能,不传参数时将禁用所有 @@ -3209,6 +3292,13 @@ 是否标识为NOT + + + 动态过滤条件 + + + + 禁用全局过滤功能,不传参数时将禁用所有 @@ -3600,6 +3690,177 @@ + + + 测试数据库是否连接正确,本方法执行如下命令: + MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1 + Oracle: SELECT 1 FROM dual + + 命令超时设置(秒) + + true: 成功, false: 失败 + + + + 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 + + + + + + + + + + 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 查询 + + + + + + + + + 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 在【主库】执行 + + + + + + + + + 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 在【主库】执行 + + + + + + + + + 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + + 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + + 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + + + 执行SQL返回对象集合,Query<User, Address>("select * from user where age > @age; select * from address", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + 可自定义解析表达式 @@ -4599,6 +4860,12 @@ 超时 + + + 获取资源 + + + 使用完毕后,归还资源 @@ -4674,6 +4941,12 @@ 资源对象 + + + 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 + + 资源对象 + 归还对象给对象池的时候触发 @@ -5604,6 +5877,28 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 + + + 动态构建Class Type + + + + + + 根据字典,创建 table 对应的实体对象 + + + + + + + + 根据实体对象,创建 table 对应的字典 + + + + + C#: that >= between && that <= and diff --git a/FreeSql/Interface/Curd/IDelete.cs b/FreeSql/Interface/Curd/IDelete.cs index 95d6c19b..2a7f4304 100644 --- a/FreeSql/Interface/Curd/IDelete.cs +++ b/FreeSql/Interface/Curd/IDelete.cs @@ -4,6 +4,7 @@ using System.Data.Common; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; +using FreeSql.Internal.Model; namespace FreeSql { @@ -80,13 +81,19 @@ namespace FreeSql /// 是否标识为NOT /// IDelete WhereDynamic(object dywhere, bool not = false); + /// + /// 动态过滤条件 + /// + /// + /// + IDelete WhereDynamicFilter(DynamicFilterInfo filter); - /// - /// 禁用全局过滤功能,不传参数时将禁用所有 - /// - /// 零个或多个过滤器名字 - /// - IDelete DisableGlobalFilter(params string[] name); + /// + /// 禁用全局过滤功能,不传参数时将禁用所有 + /// + /// 零个或多个过滤器名字 + /// + IDelete DisableGlobalFilter(params string[] name); /// /// 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名; diff --git a/FreeSql/Interface/Curd/IUpdate.cs b/FreeSql/Interface/Curd/IUpdate.cs index 5810bd4c..1224f769 100644 --- a/FreeSql/Interface/Curd/IUpdate.cs +++ b/FreeSql/Interface/Curd/IUpdate.cs @@ -238,13 +238,19 @@ namespace FreeSql /// 是否标识为NOT /// IUpdate WhereDynamic(object dywhere, bool not = false); + /// + /// 动态过滤条件 + /// + /// + /// + IUpdate WhereDynamicFilter(DynamicFilterInfo filter); - /// - /// 禁用全局过滤功能,不传参数时将禁用所有 - /// - /// 零个或多个过滤器名字 - /// - IUpdate DisableGlobalFilter(params string[] name); + /// + /// 禁用全局过滤功能,不传参数时将禁用所有 + /// + /// 零个或多个过滤器名字 + /// + IUpdate DisableGlobalFilter(params string[] name); /// /// 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名; diff --git a/FreeSql/Internal/CommonProvider/DeleteProvider.cs b/FreeSql/Internal/CommonProvider/DeleteProvider.cs index 30588fad..bb22abf1 100644 --- a/FreeSql/Internal/CommonProvider/DeleteProvider.cs +++ b/FreeSql/Internal/CommonProvider/DeleteProvider.cs @@ -120,8 +120,21 @@ namespace FreeSql.Internal.CommonProvider public IDelete WhereDynamic(object dywhere, bool not = false) => not == false ? this.Where(_commonUtils.WhereObject(_table, "", dywhere)) : this.Where($"not({_commonUtils.WhereObject(_table, "", dywhere)})"); + public IDelete WhereDynamicFilter(DynamicFilterInfo filter) + { + var alias = "t_" + Guid.NewGuid().ToString("n").Substring(0, 8); + var tempQuery = _orm.Select().AsType(_table.Type).DisableGlobalFilter().As(alias); + tempQuery.WhereDynamicFilter(filter); + var where = (tempQuery as Select0Provider)._where.ToString().Replace(alias + ".", ""); + if (where.StartsWith(" AND ")) + { + if (++_whereTimes == 1) _where.Append(where.Substring(5)); + else _where.Append(where); + } + return this; + } - public IDelete DisableGlobalFilter(params string[] name) + public IDelete DisableGlobalFilter(params string[] name) { if (_whereGlobalFilter.Any() == false) return this; if (name?.Any() != true) diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 26d1bbe9..b17e2fa4 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -847,8 +847,17 @@ namespace FreeSql.Internal.CommonProvider public IUpdate WhereDynamic(object dywhere, bool not = false) => not == false ? this.Where(_commonUtils.WhereObject(_table, "", dywhere)) : this.Where($"not({_commonUtils.WhereObject(_table, "", dywhere)})"); + public IUpdate WhereDynamicFilter(DynamicFilterInfo filter) + { + var alias = "t_" + Guid.NewGuid().ToString("n").Substring(0, 8); + var tempQuery = _orm.Select().AsType(_table.Type).DisableGlobalFilter().As(alias); + tempQuery.WhereDynamicFilter(filter); + var where = (tempQuery as Select0Provider)._where.ToString().Replace(alias + ".", ""); + _where.Append(where); + return this; + } - public IUpdate DisableGlobalFilter(params string[] name) + public IUpdate DisableGlobalFilter(params string[] name) { if (_whereGlobalFilter.Any() == false) return this; if (name?.Any() != true)