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
) &&