From 02ffe9318227e2a52b1e14720263b4646c79bb5e Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 30 Nov 2023 14:35:00 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20Where(a=20=3D>=20a.boo?= =?UTF-8?q?l)=20=E5=BD=93=E4=BD=BF=E7=94=A8=E4=BA=86=20MapType(int)=20?= =?UTF-8?q?=E6=97=B6=E5=87=BA=E7=8E=B0=20bug=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 9 + .../PostgreSQLExpression/OtherTest.cs | 20 +- FreeSql/FreeSql.xml | 281 ------------------ FreeSql/Internal/CommonExpression.cs | 24 +- .../CommonProvider/CodeFirstProvider.cs | 2 +- 5 files changed, 40 insertions(+), 296 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 537315e2..26522f10 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -800,5 +800,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs index bc2d5c41..b3a3fbee 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLExpression/OtherTest.cs @@ -16,6 +16,7 @@ namespace FreeSql.Tests.PostgreSQLExpression { ISelect select => g.pgsql.Select(); + IFreeSql fsql => g.pgsql; [Fact] public void Div() @@ -32,11 +33,24 @@ namespace FreeSql.Tests.PostgreSQLExpression var t8 = select.Where(a => a.testFieldDecimal / 3 > 3).Limit(10).ToList(); var t9 = select.Where(a => a.testFieldFloat / 3 > 3).Limit(10).ToList(); } - - [Fact] + [Table(DisableSyncStructure = true)] + public class Student + { + public string Name { get; set; } + [Column(MapType = typeof(int))] + public bool IsDelete { get; set; } + } + [Fact] public void Boolean() { - var t1 = select.Where(a => a.testFieldBool == true).Limit(10).ToList(); + var mapintSql01 = fsql.Select().Where(d => d.IsDelete).ToSql("1"); + var mapintSql02 = fsql.Select().Where(d => d.IsDelete == true).ToSql("1"); + Assert.Equal(mapintSql02, mapintSql01); + Assert.Equal(@"SELECT 1 +FROM ""student"" a +WHERE (a.""isdelete"" = 1)", mapintSql01); + + var t1 = select.Where(a => a.testFieldBool == true).Limit(10).ToList(); var t2 = select.Where(a => a.testFieldBool != true).Limit(10).ToList(); var t3 = select.Where(a => a.testFieldBool == false).Limit(10).ToList(); var t4 = select.Where(a => !a.testFieldBool).Limit(10).ToList(); diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 563be88b..0c0bbd01 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1104,82 +1104,6 @@ - - - 动态创建实体类型 - - - - - 配置Class - - 类名 - 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] - - - - - 配置属性 - - 属性名称 - 属性类型 - 属性标记的特性-支持多个 - - - - - 配置属性 - - 属性名称 - 属性类型 - 该属性是否重写父类属性 - 属性标记的特性-支持多个 - - - - - 配置属性 - - 属性名称 - 属性类型 - 该属性是否重写父类属性 - 属性默认值 - 属性标记的特性-支持多个 - - - - - 配置父类 - - 父类类型 - - - - - Override属性 - - - - - - Emit动态创建出Class - Type - - - - - - 首字母小写 - - - - - - - 首字母大写 - - - - 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -3676,177 +3600,6 @@ - - - 测试数据库是否连接正确,本方法执行如下命令: - 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> - - - - - - - - 可自定义解析表达式 @@ -4846,12 +4599,6 @@ 超时 - - - 获取资源 - - - 使用完毕后,归还资源 @@ -4927,12 +4674,6 @@ 资源对象 - - - 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 - - 资源对象 - 归还对象给对象池的时候触发 @@ -5863,28 +5604,6 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 - - - 动态构建Class Type - - - - - - 根据字典,创建 table 对应的实体对象 - - - - - - - - 根据实体对象,创建 table 对应的字典 - - - - - C#: that >= between && that <= and diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 16b5dacc..3b600f0d 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -708,7 +708,7 @@ namespace FreeSql.Internal public string ExpressionWhereLambdaNoneForeignObject(List _tables, Func _tableRule, TableInfo table, List _selectColumnMap, Expression exp, BaseDiyMemberExpression diymemexp, List dbParams) { var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, _tableRule = _tableRule, _selectColumnMap = _selectColumnMap, diymemexp = diymemexp, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = table, dbParams = dbParams }); - return GetBoolString(exp, sql); + return GetBoolString(exp, SearchColumnByField(_tables, null, sql), sql); } public string ExpressionWhereLambda(List _tables, Func _tableRule, Expression exp, BaseDiyMemberExpression diymemexp, List whereGlobalFilter, List dbParams) @@ -720,7 +720,7 @@ namespace FreeSql.Internal tb.Alias = tb.Parameter.Name; } var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, _tableRule = _tableRule, diymemexp = diymemexp, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, whereGlobalFilter = whereGlobalFilter, dbParams = dbParams }); - return GetBoolString(exp, sql); + return GetBoolString(exp, SearchColumnByField(_tables, null, sql), sql); } static ConcurrentDictionary dicRegexAlias = new ConcurrentDictionary(); public void ExpressionJoinLambda(List _tables, Func _tableRule, SelectTableInfoType tbtype, Expression exp, BaseDiyMemberExpression diymemexp, List whereGlobalFilter) @@ -733,7 +733,7 @@ namespace FreeSql.Internal tb.Alias = tb.Parameter.Name; } var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, _tableRule = _tableRule, diymemexp = diymemexp, tbtype = tbtype, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, whereGlobalFilter = whereGlobalFilter }); - sql = GetBoolString(exp, sql); + sql = GetBoolString(exp, SearchColumnByField(_tables, null, sql), sql); if (_tables.Count > tbidx) { @@ -765,11 +765,11 @@ namespace FreeSql.Internal static MethodInfo MethodDateTimeSubtractTimeSpan = typeof(DateTime).GetMethod("Subtract", new Type[] { typeof(TimeSpan) }); static MethodInfo MethodMathFloor = typeof(Math).GetMethod("Floor", new Type[] { typeof(double) }); - public string GetBoolString(Expression exp, string sql) + public string GetBoolString(Expression exp, ColumnInfo column, string sql) { var isBool = exp.Type.NullableTypeOrThis() == typeof(bool); if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false) - return $"{sql} = {formatSql(true, null, null, null)}"; + return $"{sql} = {formatSql(true, column?.Attribute.MapType, null, null)}"; if (isBool) return GetBoolString(sql); return sql; @@ -818,11 +818,13 @@ namespace FreeSql.Internal if (oper == "OR") { var leftBool = ExpressionLambdaToSql(leftExp, tsc); - if (SearchColumnByField(tsc._tables, tsc.currentTable, leftBool) != null) leftBool = $"{leftBool} = {formatSql(true, null, null, null)}"; + var leftColumn = SearchColumnByField(tsc._tables, tsc.currentTable, leftBool); + if (leftColumn != null) leftBool = $"{leftBool} = {formatSql(true, leftColumn.Attribute.MapType, null, null)}"; else leftBool = GetBoolString(leftBool); var rightBool = ExpressionLambdaToSql(rightExp, tsc); - if (SearchColumnByField(tsc._tables, tsc.currentTable, rightBool) != null) rightBool = $"{rightBool} = {formatSql(true, null, null, null)}"; + var rightColumn = SearchColumnByField(tsc._tables, tsc.currentTable, rightBool); + if (rightColumn != null) rightBool = $"{rightBool} = {formatSql(true, rightColumn.Attribute.MapType, null, null)}"; else rightBool = GetBoolString(rightBool); if (_common._orm?.Ado?.DataType == DataType.QuestDb) return $"(({leftBool}) {oper} ({rightBool}))"; return $"({leftBool} {oper} {rightBool})"; @@ -946,10 +948,10 @@ namespace FreeSql.Internal break; case "AND": case "OR": - if (leftMapColumn != null) left = $"{left} = {formatSql(true, null, null, null)}"; + if (leftMapColumn != null) left = $"{left} = {formatSql(true, leftMapColumn.Attribute.MapType, null, null)}"; else left = GetBoolString(left); if (rightMapColumn == null) rightMapColumn = SearchColumnByField(tsc._tables, tsc.currentTable, right); - if (rightMapColumn != null) right = $"{right} = {formatSql(true, null, null, null)}"; + if (rightMapColumn != null) right = $"{right} = {formatSql(true, rightMapColumn.Attribute.MapType, null, null)}"; else right = GetBoolString(right); break; } @@ -2410,7 +2412,7 @@ namespace FreeSql.Internal new ReplaceParameterVisitor().Modify(fl.Where, newParameter), newParameter ); - var whereSql = ExpressionLambdaToSql(expExp.Body, new ExpTSC + var whereSql = ExpressionLambdaToSql(expExp.Body, new ExpTSC { _tables = isMultitb ? new List(new[] { tb }) : null, _selectColumnMap = null, @@ -2422,7 +2424,7 @@ namespace FreeSql.Internal currentTable = tb.Table, alias001 = tb.Alias }); - whereSql = GetBoolString(expExp.Body, whereSql); + whereSql = GetBoolString(expExp.Body, null, whereSql); if (isEmpty == false) sb.Append(" AND "); else diff --git a/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs b/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs index 827658b6..47f78852 100644 --- a/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs +++ b/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs @@ -101,7 +101,7 @@ namespace FreeSql.Internal.CommonProvider if (objects == null) return; var syncObjects = objects.Where(a => a.tableSchema?.Type != null && ( - a.tableSchema.Type.Name == "DynamicRepository" && a.tableSchema.Columns.Any() + a.tableSchema.Type.Name == "DynamicDbContext" && a.tableSchema.Columns.Any() || a.tableSchema.Type != typeof(object) && _dicSycedGetOrAdd(a.tableSchema.Type).ContainsKey(GetTableNameLowerOrUpper(a.tableName)) == false ) &&