From 2a3db8a2c2795ce0d67600f82015bf30a9fe5dc1 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 28 Jun 2023 17:44:13 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20Enum.ToString()=20?= =?UTF-8?q?=E5=8D=B3=E4=BD=BF=20MapType=3Dint=20=E4=B9=9F=E5=BA=94?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E6=88=90=20string=EF=BC=9B#1252=20#806?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 20 ++++++++++--------- FreeSql.DbContext/FreeSql.DbContext.xml | 18 ----------------- .../ClickHouseExpression.cs | 13 +++++++++++- .../CustomExpression.cs | 13 +++++++++++- .../MySql/CustomMySqlExpression.cs | 13 +++++++++++- .../Oracle/CustomOracleExpression.cs | 13 +++++++++++- .../PostgreSQL/CustomPostgreSQLExpression.cs | 13 +++++++++++- .../SqlServer/CustomSqlServerExpression.cs | 15 ++++++++++++-- .../DamengExpression.cs | 13 +++++++++++- .../FirebirdExpression.cs | 13 +++++++++++- .../FreeSql.Provider.GBase/GBaseExpression.cs | 13 +++++++++++- .../KingbaseESExpression.cs | 13 +++++++++++- .../MsAccessExpression.cs | 13 +++++++++++- .../FreeSql.Provider.MySql/MySqlExpression.cs | 13 +++++++++++- .../Dameng/OdbcDamengExpression.cs | 13 +++++++++++- .../Default/OdbcExpression.cs | 13 +++++++++++- .../KingbaseES/OdbcKingbaseESExpression.cs | 13 +++++++++++- .../MySql/OdbcMySqlExpression.cs | 13 +++++++++++- .../Oracle/OdbcOracleExpression.cs | 13 +++++++++++- .../PostgreSQL/OdbcPostgreSQLExpression.cs | 13 +++++++++++- .../SqlServer/OdbcSqlServerExpression.cs | 15 ++++++++++++-- .../OracleExpression.cs | 13 +++++++++++- .../PostgreSQLExpression.cs | 13 +++++++++++- .../QuestDbExpression.cs | 10 ++++++++++ .../ShenTongExpression.cs | 13 +++++++++++- .../SqlServerExpression.cs | 17 +++++++++++++--- .../SqliteExpression.cs | 13 +++++++++++- .../FreeSql.Provider.Xugu/XuguExpression.cs | 13 +++++++++++- 28 files changed, 325 insertions(+), 56 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 7e14b11b..eae8cb3d 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -590,7 +590,7 @@ namespace base_entity //.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) //.UseConnectionString(FreeSql.DataType.OdbcDameng, "Driver={DM8 ODBC DRIVER};Server=127.0.0.1:5236;Persist Security Info=False;Trusted_Connection=Yes;UID=USER1;PWD=123456789") - //.UseConnectionString(DataType.QuestDb, "host=localhost;port=8812;username=admin;password=quest;database=qdb;ServerCompatibilityMode=NoTypeLoading;") + .UseConnectionString(DataType.QuestDb, "host=localhost;port=8812;username=admin;password=quest;database=qdb;ServerCompatibilityMode=NoTypeLoading;") .UseMonitorCommand(cmd => { Console.WriteLine(cmd.CommandText + "\r\n"); @@ -602,6 +602,16 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + var qr1 = fsql.SelectLongSequence(10, () => new + { + rndstr = QuestFunc.rnd_str(10, 5, 10, 0), + rnddate = QuestFunc.rnd_date(QuestFunc.to_date("2020", "yyyy"), QuestFunc.to_date("2023", "yyyy")), + test1 = TaskStatus.Canceled.ToString() + }) + .From() + .InnerJoin((a, b) => a.rndstr == b.Username).ToList(); + + ; fsql.Aop.ParseExpression += (_, e) => { @@ -669,14 +679,6 @@ namespace base_entity .Where(a => geo.GetGeometryN(0).Distance(a.Center) < 100).ToSql(); } - var qr1 = fsql.SelectLongSequence(10, () => new - { - rndstr = QuestFunc.rnd_str(10, 5, 10, 0), - rnddate = QuestFunc.rnd_date(QuestFunc.to_date("2020", "yyyy"), QuestFunc.to_date("2023", "yyyy")) - }) - .From() - .InnerJoin((a, b) => a.rndstr == b.Username).ToList(); - var now_to_timezone = ""; var timeOffset = (int)TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).TotalMinutes; diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 26522f10..594fbad3 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -733,15 +733,6 @@ - - - 根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类 - - - - - - 创建普通数据上下文档对象 @@ -800,14 +791,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseExpression.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseExpression.cs index 69018e16..cc613093 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseExpression.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseExpression.cs @@ -88,7 +88,18 @@ namespace FreeSql.ClickHouse if (callExp.Method.DeclaringType.IsNumberType()) return "rand()"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as String)" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as String)" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Custom/CustomExpression.cs b/Providers/FreeSql.Provider.Custom/CustomExpression.cs index 03cfc56f..82e29406 100644 --- a/Providers/FreeSql.Provider.Custom/CustomExpression.cs +++ b/Providers/FreeSql.Provider.Custom/CustomExpression.cs @@ -90,7 +90,18 @@ namespace FreeSql.Custom if (callExp.Method.DeclaringType.IsNumberType()) return _utils.Adapter.LambdaRandom_NextDouble; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? _utils.Adapter.LambdaConvert_ToString(callExp.Object.Type, getExp(callExp.Object)) : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? _utils.Adapter.LambdaConvert_ToString(callExp.Object.Type, getExp(callExp.Object)) : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlExpression.cs b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlExpression.cs index 6278ba2c..9a567033 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlExpression.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlExpression.cs @@ -86,7 +86,18 @@ namespace FreeSql.Custom.MySql if (callExp.Method.DeclaringType.IsNumberType()) return "rand()"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as char)" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as char)" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleExpression.cs b/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleExpression.cs index 79c78b4c..ade84d94 100644 --- a/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleExpression.cs +++ b/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleExpression.cs @@ -90,7 +90,18 @@ namespace FreeSql.Custom.Oracle if (callExp.Method.DeclaringType.IsNumberType()) return "dbms_random.value"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"to_char({getExp(callExp.Object)})" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"to_char({getExp(callExp.Object)})" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLExpression.cs b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLExpression.cs index 084e5428..e1c7f938 100644 --- a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLExpression.cs @@ -89,7 +89,18 @@ namespace FreeSql.Custom.PostgreSQL if (callExp.Method.DeclaringType.IsNumberType()) return "random()"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::text" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::text" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerExpression.cs b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerExpression.cs index ad64a574..b48de418 100644 --- a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerExpression.cs +++ b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerExpression.cs @@ -93,10 +93,21 @@ namespace FreeSql.Custom.SqlServer if (callExp.Method.DeclaringType.IsNumberType()) return "rand()"; return null; case "ToString": - var gentype2 = callExp.Object.Type.NullableTypeOrThis(); - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? (gentype2 == typeof(Guid) ? + if (callExp.Object != null) + { + var gentype2 = callExp.Object.Type.NullableTypeOrThis(); + if (gentype2.IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? (gentype2 == typeof(Guid) ? $"cast({getExp(callExp.Object)} as varchar(36))" : $"cast({getExp(callExp.Object)} as nvarchar{(gentype2.IsNumberType() || gentype2.IsEnum ? "(100)" : "(max)")})") : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Dameng/DamengExpression.cs b/Providers/FreeSql.Provider.Dameng/DamengExpression.cs index 709cd99c..1a91444b 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengExpression.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengExpression.cs @@ -90,7 +90,18 @@ namespace FreeSql.Dameng if (callExp.Method.DeclaringType.IsNumberType()) return "dbms_random.value"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"to_char({getExp(callExp.Object)})" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"to_char({getExp(callExp.Object)})" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs b/Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs index 0be85aed..f45a3d8f 100644 --- a/Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs +++ b/Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs @@ -87,7 +87,18 @@ namespace FreeSql.Firebird if (callExp.Method.DeclaringType.IsNumberType()) return "rand()"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as blob sub_type 1)" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as blob sub_type 1)" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.GBase/GBaseExpression.cs b/Providers/FreeSql.Provider.GBase/GBaseExpression.cs index 13bc26e6..14f1b682 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseExpression.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseExpression.cs @@ -87,7 +87,18 @@ namespace FreeSql.GBase if (callExp.Method.DeclaringType.IsNumberType()) return "random()"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as varchar(8000))" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as varchar(8000))" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs b/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs index 48162780..272a328e 100644 --- a/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs +++ b/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs @@ -89,7 +89,18 @@ namespace FreeSql.KingbaseES if (callExp.Method.DeclaringType.IsNumberType()) return "random()"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::text" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::text" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs b/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs index 9533376f..fc822109 100644 --- a/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs +++ b/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs @@ -60,7 +60,18 @@ namespace FreeSql.MsAccess if (callExp.Method.DeclaringType.IsNumberType()) return "rnd"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? MsAccessUtils.GetCastSql(getExp(callExp.Object), typeof(string)) : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? MsAccessUtils.GetCastSql(getExp(callExp.Object), typeof(string)) : null; + } return null; } diff --git a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs index 1a318364..722abaac 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs @@ -88,7 +88,18 @@ namespace FreeSql.MySql if (callExp.Method.DeclaringType.IsNumberType()) return "rand()"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as char)" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as char)" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs index 24427d6a..f035f8dd 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs @@ -90,7 +90,18 @@ namespace FreeSql.Odbc.Dameng if (callExp.Method.DeclaringType.IsNumberType()) return "dbms_random.value"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"to_char({getExp(callExp.Object)})" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"to_char({getExp(callExp.Object)})" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs index 1ab6ef4d..bc3cde86 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs @@ -90,7 +90,18 @@ namespace FreeSql.Odbc.Default if (callExp.Method.DeclaringType.IsNumberType()) return _utils.Adapter.LambdaRandom_NextDouble; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? _utils.Adapter.LambdaConvert_ToString(callExp.Object.Type, getExp(callExp.Object)) : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? _utils.Adapter.LambdaConvert_ToString(callExp.Object.Type, getExp(callExp.Object)) : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESExpression.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESExpression.cs index edb4ac56..8a91d8ae 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESExpression.cs @@ -89,7 +89,18 @@ namespace FreeSql.Odbc.KingbaseES if (callExp.Method.DeclaringType.IsNumberType()) return "random()"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::text" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::text" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs index 1c0538a8..e6553023 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs @@ -86,7 +86,18 @@ namespace FreeSql.Odbc.MySql if (callExp.Method.DeclaringType.IsNumberType()) return "rand()"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as char)" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as char)" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs index 23f2bd16..d76711fc 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs @@ -90,7 +90,18 @@ namespace FreeSql.Odbc.Oracle if (callExp.Method.DeclaringType.IsNumberType()) return "dbms_random.value"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"to_char({getExp(callExp.Object)})" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"to_char({getExp(callExp.Object)})" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs index 8bac205c..c1be4f3e 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs @@ -89,7 +89,18 @@ namespace FreeSql.Odbc.PostgreSQL if (callExp.Method.DeclaringType.IsNumberType()) return "random()"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::text" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::text" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs index a342d154..a8f882fc 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs @@ -93,10 +93,21 @@ namespace FreeSql.Odbc.SqlServer if (callExp.Method.DeclaringType.IsNumberType()) return "rand()"; return null; case "ToString": - var gentype2 = callExp.Object.Type.NullableTypeOrThis(); - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? (gentype2 == typeof(Guid) ? + if (callExp.Object != null) + { + var gentype2 = callExp.Object.Type.NullableTypeOrThis(); + if (gentype2.IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? (gentype2 == typeof(Guid) ? $"cast({getExp(callExp.Object)} as varchar(36))" : $"cast({getExp(callExp.Object)} as nvarchar{(gentype2.IsNumberType() || gentype2.IsEnum ? "(100)" : "(max)")})") : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs index 8a5396bc..d1a81ecb 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs @@ -90,7 +90,18 @@ namespace FreeSql.Oracle if (callExp.Method.DeclaringType.IsNumberType()) return "dbms_random.value"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"to_char({getExp(callExp.Object)})" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"to_char({getExp(callExp.Object)})" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs index d5446a66..17bfca7b 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs @@ -90,7 +90,18 @@ namespace FreeSql.PostgreSQL if (callExp.Method.DeclaringType.IsNumberType()) return "random()"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::text" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::text" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.QuestDb/QuestDbExpression.cs b/Providers/FreeSql.Provider.QuestDb/QuestDbExpression.cs index 5df75f61..c3932471 100644 --- a/Providers/FreeSql.Provider.QuestDb/QuestDbExpression.cs +++ b/Providers/FreeSql.Provider.QuestDb/QuestDbExpression.cs @@ -96,7 +96,17 @@ namespace FreeSql.QuestDb return null; case "ToString": if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as string)" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs b/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs index f2a7f203..c6c3601d 100644 --- a/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs +++ b/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs @@ -89,7 +89,18 @@ namespace FreeSql.ShenTong if (callExp.Method.DeclaringType.IsNumberType()) return "random()"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::text" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::text" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs index 71549e7b..fc3af82e 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs @@ -92,10 +92,21 @@ namespace FreeSql.SqlServer if (callExp.Method.DeclaringType.IsNumberType()) return "rand()"; return null; case "ToString": - var gentype2 = callExp.Object.Type.NullableTypeOrThis(); - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? (gentype2 == typeof(Guid) ? - $"cast({getExp(callExp.Object)} as varchar(36))" : + if (callExp.Object != null) + { + var gentype2 = callExp.Object.Type.NullableTypeOrThis(); + if (gentype2.IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? (gentype2 == typeof(Guid) ? + $"cast({getExp(callExp.Object)} as varchar(36))" : $"cast({getExp(callExp.Object)} as nvarchar{(gentype2.IsNumberType() || gentype2.IsEnum ? "(100)" : "(max)")})") : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs index 28e69ed5..d1bcb6f5 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs @@ -86,7 +86,18 @@ namespace FreeSql.Sqlite if (callExp.Method.DeclaringType.IsNumberType()) return "random()"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as character)" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as character)" : null; + } return null; } diff --git a/Providers/FreeSql.Provider.Xugu/XuguExpression.cs b/Providers/FreeSql.Provider.Xugu/XuguExpression.cs index 7dc206b7..d29a17bc 100644 --- a/Providers/FreeSql.Provider.Xugu/XuguExpression.cs +++ b/Providers/FreeSql.Provider.Xugu/XuguExpression.cs @@ -90,7 +90,18 @@ namespace FreeSql.Xugu if (callExp.Method.DeclaringType.IsNumberType()) return "random()"; return null; case "ToString": - if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::text" : null; + if (callExp.Object != null) + { + if (callExp.Object.Type.NullableTypeOrThis().IsEnum) + { + tsc.SetMapColumnTmp(null); + var oldMapType = tsc.SetMapTypeReturnOld(typeof(string)); + var enumStr = ExpressionLambdaToSql(callExp.Object, tsc); + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + return enumStr; + } + return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::text" : null; + } return null; }