From 396d113d5fd53d830cfb12b3d32c6395b1568a19 Mon Sep 17 00:00:00 2001 From: "bob.li" Date: Mon, 3 Apr 2023 17:27:10 +0800 Subject: [PATCH 01/58] 20230403 --- FreeSql.DbContext/FreeSql.DbContext.xml | 18 ++ .../UnitDbFirst.cs | 1 - FreeSql.sln | 18 +- FreeSql/FreeSql.xml | 183 ------------------ 4 files changed, 34 insertions(+), 186 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 594fbad3..26522f10 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -733,6 +733,15 @@ + + + 根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类 + + + + + + 创建普通数据上下文档对象 @@ -791,5 +800,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Xugu/UnitDbFirst.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Xugu/UnitDbFirst.cs index 24995607..7ff09887 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Xugu/UnitDbFirst.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Xugu/UnitDbFirst.cs @@ -24,7 +24,6 @@ namespace FreeSql.Tests.Provider.Xugu var fsql = g.xugu; var t1 = fsql.DbFirst.GetTableByName("GENERAL.system_log"); Assert.NotNull(t1); - Assert.True(t1.Columns.Count > 0); } [Fact] diff --git a/FreeSql.sln b/FreeSql.sln index 1e6e6788..e20ed226 100644 --- a/FreeSql.sln +++ b/FreeSql.sln @@ -123,6 +123,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.Aggregat EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.Xugu", "Providers\FreeSql.Provider.Xugu\FreeSql.Provider.Xugu.csproj", "{8064870C-22EA-4A58-972D-DBD57D096D91}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.Provider.Xugu", "FreeSql.Tests\FreeSql.Tests.Provider.Xugu\FreeSql.Tests.Provider.Xugu.csproj", "{16C21D77-20AC-4722-AD97-F53BDDE8210C}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -733,6 +735,18 @@ Global {8064870C-22EA-4A58-972D-DBD57D096D91}.Release|x64.Build.0 = Release|Any CPU {8064870C-22EA-4A58-972D-DBD57D096D91}.Release|x86.ActiveCfg = Release|Any CPU {8064870C-22EA-4A58-972D-DBD57D096D91}.Release|x86.Build.0 = Release|Any CPU + {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Debug|x64.ActiveCfg = Debug|Any CPU + {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Debug|x64.Build.0 = Debug|Any CPU + {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Debug|x86.ActiveCfg = Debug|Any CPU + {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Debug|x86.Build.0 = Debug|Any CPU + {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Release|Any CPU.Build.0 = Release|Any CPU + {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Release|x64.ActiveCfg = Release|Any CPU + {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Release|x64.Build.0 = Release|Any CPU + {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Release|x86.ActiveCfg = Release|Any CPU + {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -775,8 +789,8 @@ Global {8064870C-22EA-4A58-972D-DBD57D096D91} = {2A381C57-2697-427B-9F10-55DA11FD02E4} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {089687FD-5D25-40AB-BA8A-A10D1E137F98} - RESX_PrefixTranslations = True RESX_NeutralResourcesLanguage = en-US + RESX_PrefixTranslations = True + SolutionGuid = {089687FD-5D25-40AB-BA8A-A10D1E137F98} EndGlobalSection EndGlobal diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 5323d7da..1973f9b2 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3519,177 +3519,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> - - - - - - - - 可自定义解析表达式 @@ -4680,12 +4509,6 @@ 超时 - - - 获取资源 - - - 使用完毕后,归还资源 @@ -4761,12 +4584,6 @@ 资源对象 - - - 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 - - 资源对象 - 归还对象给对象池的时候触发 From aa13fc49a75cf013cc7e5036e14e918806a52713 Mon Sep 17 00:00:00 2001 From: hyzx86 Date: Tue, 4 Apr 2023 16:28:54 +0800 Subject: [PATCH 02/58] =?UTF-8?q?=E4=B8=BA=E6=89=80=E6=9C=89=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=20CodeFirst=20=20=E4=B8=AD=E7=9A=84=20LocalE?= =?UTF-8?q?xecuteScalar=20=20=E5=A2=9E=E5=8A=A0=20AOP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 18 ++++++++++++++++++ .../SqlServer/SqlServerCodeFirstTest.cs | 2 +- .../ClickHouseCodeFirst.cs | 4 +++- .../MySql/CustomMySqlCodeFirst.cs | 4 +++- .../SqlServer/CustomSqlServerCodeFirst.cs | 2 ++ .../FreeSql.Provider.GBase/GBaseCodeFirst.cs | 4 +++- .../FreeSql.Provider.MySql/MySqlCodeFirst.cs | 2 ++ .../MySql/OdbcMySqlCodeFirst.cs | 2 ++ .../SqlServer/OdbcSqlServerCodeFirst.cs | 2 ++ .../SqlServerCodeFirst.cs | 2 ++ 10 files changed, 38 insertions(+), 4 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 594fbad3..26522f10 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -733,6 +733,15 @@ + + + 根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类 + + + + + + 创建普通数据上下文档对象 @@ -791,5 +800,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs index 6e4685ad..28ee5c9e 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs @@ -612,8 +612,8 @@ WHERE ([id] = '{item.id}')", fsql.Update().NoneParameter().Set(a = [Fact] public void AddUniques() { - var sql = g.sqlserver.CodeFirst.GetComparisonDDLStatements(); g.sqlserver.CodeFirst.SyncStructure(); + var sql = g.sqlserver.CodeFirst.GetComparisonDDLStatements(); g.sqlserver.CodeFirst.SyncStructure(typeof(AddUniquesInfo), "AddUniquesInfo1"); } [Table(Name = "AddUniquesInfo", OldName = "AddUniquesInfo2")] diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs index 363f8d84..2264d4be 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs @@ -480,7 +480,9 @@ where a.database in ({0}) and a.table in ({1})", tboldname ?? tbname); using (var cmd = conn.Value.CreateCommand()) { cmd.CommandText = sql; - cmd.CommandType = CommandType.Text; + cmd.CommandType = CommandType.Text; + var before = new Aop.CommandBeforeEventArgs(cmd); + this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs index bee6e372..d381d2c1 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs @@ -78,7 +78,7 @@ namespace FreeSql.Custom.MySql { Object conn = null; string database = null; - + try { conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)); @@ -382,6 +382,8 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; + var before = new Aop.CommandBeforeEventArgs(cmd); + this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerCodeFirst.cs b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerCodeFirst.cs index 96513be2..15e66e4e 100644 --- a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerCodeFirst.cs @@ -474,6 +474,8 @@ use [" + database + "];", tboldname ?? tbname); { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; + var before = new Aop.CommandBeforeEventArgs(cmd); + this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.GBase/GBaseCodeFirst.cs b/Providers/FreeSql.Provider.GBase/GBaseCodeFirst.cs index 60a834fa..cc96cc02 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseCodeFirst.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseCodeFirst.cs @@ -186,7 +186,9 @@ namespace FreeSql.GBase using (var cmd = conn.Value.CreateCommand()) { cmd.CommandText = sql; - cmd.CommandType = CommandType.Text; + cmd.CommandType = CommandType.Text; + var before = new Aop.CommandBeforeEventArgs(cmd); + this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs index 7aac0ed7..6a9fbb86 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs @@ -393,6 +393,8 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; + var before = new Aop.CommandBeforeEventArgs(cmd); + this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs index 547e3455..7825d5d8 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs @@ -383,6 +383,8 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; + var before = new Aop.CommandBeforeEventArgs(cmd); + this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs index 2a182b8b..8445c9e9 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs @@ -475,6 +475,8 @@ use [" + database + "];", tboldname ?? tbname); { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; + var before = new Aop.CommandBeforeEventArgs(cmd); + this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs index 39b524f9..ae18b74e 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs @@ -477,6 +477,8 @@ use [" + database + "];", tboldname ?? tbname); { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; + var before = new Aop.CommandBeforeEventArgs(cmd); + this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } From 0b4124202e28859f9618aa1ede6a0e072e256fbc Mon Sep 17 00:00:00 2001 From: hyzx86 Date: Tue, 4 Apr 2023 16:33:24 +0800 Subject: [PATCH 03/58] =?UTF-8?q?Revert=20"=E4=B8=BA=E6=89=80=E6=9C=89?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=20CodeFirst=20=20=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=20LocalExecuteScalar=20=20=E5=A2=9E=E5=8A=A0=20AOP"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit aa13fc49a75cf013cc7e5036e14e918806a52713. --- FreeSql.DbContext/FreeSql.DbContext.xml | 18 ------------------ .../SqlServer/SqlServerCodeFirstTest.cs | 2 +- .../ClickHouseCodeFirst.cs | 4 +--- .../MySql/CustomMySqlCodeFirst.cs | 4 +--- .../SqlServer/CustomSqlServerCodeFirst.cs | 2 -- .../FreeSql.Provider.GBase/GBaseCodeFirst.cs | 4 +--- .../FreeSql.Provider.MySql/MySqlCodeFirst.cs | 2 -- .../MySql/OdbcMySqlCodeFirst.cs | 2 -- .../SqlServer/OdbcSqlServerCodeFirst.cs | 2 -- .../SqlServerCodeFirst.cs | 2 -- 10 files changed, 4 insertions(+), 38 deletions(-) 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/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs index 28ee5c9e..6e4685ad 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs @@ -612,8 +612,8 @@ WHERE ([id] = '{item.id}')", fsql.Update().NoneParameter().Set(a = [Fact] public void AddUniques() { - g.sqlserver.CodeFirst.SyncStructure(); var sql = g.sqlserver.CodeFirst.GetComparisonDDLStatements(); + g.sqlserver.CodeFirst.SyncStructure(); g.sqlserver.CodeFirst.SyncStructure(typeof(AddUniquesInfo), "AddUniquesInfo1"); } [Table(Name = "AddUniquesInfo", OldName = "AddUniquesInfo2")] diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs index 2264d4be..363f8d84 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs @@ -480,9 +480,7 @@ where a.database in ({0}) and a.table in ({1})", tboldname ?? tbname); using (var cmd = conn.Value.CreateCommand()) { cmd.CommandText = sql; - cmd.CommandType = CommandType.Text; - var before = new Aop.CommandBeforeEventArgs(cmd); - this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); + cmd.CommandType = CommandType.Text; return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs index d381d2c1..bee6e372 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs @@ -78,7 +78,7 @@ namespace FreeSql.Custom.MySql { Object conn = null; string database = null; - + try { conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)); @@ -382,8 +382,6 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; - var before = new Aop.CommandBeforeEventArgs(cmd); - this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerCodeFirst.cs b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerCodeFirst.cs index 15e66e4e..96513be2 100644 --- a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerCodeFirst.cs @@ -474,8 +474,6 @@ use [" + database + "];", tboldname ?? tbname); { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; - var before = new Aop.CommandBeforeEventArgs(cmd); - this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.GBase/GBaseCodeFirst.cs b/Providers/FreeSql.Provider.GBase/GBaseCodeFirst.cs index cc96cc02..60a834fa 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseCodeFirst.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseCodeFirst.cs @@ -186,9 +186,7 @@ namespace FreeSql.GBase using (var cmd = conn.Value.CreateCommand()) { cmd.CommandText = sql; - cmd.CommandType = CommandType.Text; - var before = new Aop.CommandBeforeEventArgs(cmd); - this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); + cmd.CommandType = CommandType.Text; return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs index 6a9fbb86..7aac0ed7 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs @@ -393,8 +393,6 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; - var before = new Aop.CommandBeforeEventArgs(cmd); - this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs index 7825d5d8..547e3455 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs @@ -383,8 +383,6 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; - var before = new Aop.CommandBeforeEventArgs(cmd); - this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs index 8445c9e9..2a182b8b 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs @@ -475,8 +475,6 @@ use [" + database + "];", tboldname ?? tbname); { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; - var before = new Aop.CommandBeforeEventArgs(cmd); - this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs index ae18b74e..39b524f9 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs @@ -477,8 +477,6 @@ use [" + database + "];", tboldname ?? tbname); { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; - var before = new Aop.CommandBeforeEventArgs(cmd); - this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } From 18c9ae954c627e9bf2b27bb95efb2047620f29a6 Mon Sep 17 00:00:00 2001 From: hyzx86 Date: Tue, 4 Apr 2023 16:42:01 +0800 Subject: [PATCH 04/58] =?UTF-8?q?=E8=BF=98=E5=8E=9F=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 27 +++++++------------ .../SqlServer/SqlServerCodeFirstTest.cs | 2 +- .../ClickHouseCodeFirst.cs | 2 +- .../MySql/CustomMySqlCodeFirst.cs | 2 +- .../FreeSql.Provider.GBase/GBaseCodeFirst.cs | 2 +- 5 files changed, 13 insertions(+), 22 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 26522f10..2df45be3 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -733,15 +733,15 @@ - - - 根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类 - - - - - - + + + 根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类 + + + + + + 创建普通数据上下文档对象 @@ -800,14 +800,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs index 28ee5c9e..6e4685ad 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs @@ -612,8 +612,8 @@ WHERE ([id] = '{item.id}')", fsql.Update().NoneParameter().Set(a = [Fact] public void AddUniques() { - g.sqlserver.CodeFirst.SyncStructure(); var sql = g.sqlserver.CodeFirst.GetComparisonDDLStatements(); + g.sqlserver.CodeFirst.SyncStructure(); g.sqlserver.CodeFirst.SyncStructure(typeof(AddUniquesInfo), "AddUniquesInfo1"); } [Table(Name = "AddUniquesInfo", OldName = "AddUniquesInfo2")] diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs index 2264d4be..c08debce 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs @@ -480,7 +480,7 @@ where a.database in ({0}) and a.table in ({1})", tboldname ?? tbname); using (var cmd = conn.Value.CreateCommand()) { cmd.CommandText = sql; - cmd.CommandType = CommandType.Text; + cmd.CommandType = CommandType.Text; var before = new Aop.CommandBeforeEventArgs(cmd); this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); diff --git a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs index d381d2c1..6efb1899 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs @@ -78,7 +78,7 @@ namespace FreeSql.Custom.MySql { Object conn = null; string database = null; - + try { conn = _orm.Ado.MasterPool.Get(TimeSpan.FromSeconds(5)); diff --git a/Providers/FreeSql.Provider.GBase/GBaseCodeFirst.cs b/Providers/FreeSql.Provider.GBase/GBaseCodeFirst.cs index cc96cc02..af79f04e 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseCodeFirst.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseCodeFirst.cs @@ -186,7 +186,7 @@ namespace FreeSql.GBase using (var cmd = conn.Value.CreateCommand()) { cmd.CommandText = sql; - cmd.CommandType = CommandType.Text; + cmd.CommandType = CommandType.Text; var before = new Aop.CommandBeforeEventArgs(cmd); this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); From f73ec96572dc15f92e812b5effbd84b7f749f542 Mon Sep 17 00:00:00 2001 From: hyzx86 Date: Tue, 4 Apr 2023 16:54:46 +0800 Subject: [PATCH 05/58] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20Mysql=EF=BC=8C=20Sql?= =?UTF-8?q?Server=20,Odbc=20=20AOP=20command=20=E6=8B=A6=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs | 2 ++ .../SqlServer/CustomSqlServerCodeFirst.cs | 2 ++ Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs | 2 ++ Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs | 2 ++ .../FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs | 2 ++ Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs | 2 ++ 6 files changed, 12 insertions(+) diff --git a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs index bee6e372..6efb1899 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs @@ -382,6 +382,8 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; + var before = new Aop.CommandBeforeEventArgs(cmd); + this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerCodeFirst.cs b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerCodeFirst.cs index 96513be2..15e66e4e 100644 --- a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerCodeFirst.cs @@ -474,6 +474,8 @@ use [" + database + "];", tboldname ?? tbname); { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; + var before = new Aop.CommandBeforeEventArgs(cmd); + this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs index 7aac0ed7..6a9fbb86 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs @@ -393,6 +393,8 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; + var before = new Aop.CommandBeforeEventArgs(cmd); + this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs index 547e3455..7825d5d8 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs @@ -383,6 +383,8 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; + var before = new Aop.CommandBeforeEventArgs(cmd); + this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs index 2a182b8b..8445c9e9 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs @@ -475,6 +475,8 @@ use [" + database + "];", tboldname ?? tbname); { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; + var before = new Aop.CommandBeforeEventArgs(cmd); + this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs index 39b524f9..ae18b74e 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs @@ -477,6 +477,8 @@ use [" + database + "];", tboldname ?? tbname); { cmd.CommandText = sql; cmd.CommandType = CommandType.Text; + var before = new Aop.CommandBeforeEventArgs(cmd); + this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); return cmd.ExecuteScalar(); } } From a264578764cdbc43198c691f6833b86556788b92 Mon Sep 17 00:00:00 2001 From: "bob.li" Date: Thu, 6 Apr 2023 13:00:29 +0800 Subject: [PATCH 06/58] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=99=9A=E8=B0=B7dbfir?= =?UTF-8?q?st?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UnitDbFirst.cs | 11 +- FreeSql/FreeSql.xml | 183 ++++++++++++++++++ .../FreeSql.Provider.Xugu/XuguDbFirst.cs | 37 +++- 3 files changed, 218 insertions(+), 13 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Xugu/UnitDbFirst.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Xugu/UnitDbFirst.cs index 7ff09887..188add87 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Xugu/UnitDbFirst.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Xugu/UnitDbFirst.cs @@ -22,15 +22,20 @@ namespace FreeSql.Tests.Provider.Xugu public void GetTableByName() { var fsql = g.xugu; - var t1 = fsql.DbFirst.GetTableByName("GENERAL.system_log"); - Assert.NotNull(t1); + fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); + var t1 = fsql.DbFirst.GetTableByName("test_existstb01"); + Assert.NotNull(t1); + Assert.True(t1.Columns.Count > 0); + var t3 = fsql.DbFirst.GetTableByName("notexists_tb"); + Assert.Null(t3); + fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); } [Fact] public void ExistsTable() { var fsql = g.xugu; - Assert.False(fsql.DbFirst.ExistsTable("GENERAL.system_log")); + Assert.False(fsql.DbFirst.ExistsTable("test_existstb01")); fsql.CodeFirst.SyncStructure(typeof(test_existstb01)); Assert.True(fsql.DbFirst.ExistsTable("test_existstb01")); fsql.Ado.ExecuteNonQuery("drop table test_existstb01"); diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 1973f9b2..5323d7da 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3519,6 +3519,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> + + + + + + + + 可自定义解析表达式 @@ -4509,6 +4680,12 @@ 超时 + + + 获取资源 + + + 使用完毕后,归还资源 @@ -4584,6 +4761,12 @@ 资源对象 + + + 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 + + 资源对象 + 归还对象给对象池的时候触发 diff --git a/Providers/FreeSql.Provider.Xugu/XuguDbFirst.cs b/Providers/FreeSql.Provider.Xugu/XuguDbFirst.cs index b040d8fd..b58e90e7 100644 --- a/Providers/FreeSql.Provider.Xugu/XuguDbFirst.cs +++ b/Providers/FreeSql.Provider.Xugu/XuguDbFirst.cs @@ -442,14 +442,15 @@ where IS_SYS=false and {loc8.ToString().Replace("a.table_name", "ns.SCHEMA_NAME { sql = $@" select -schema_name || '.' || b.table_name as table_id, -cons_name as FKId, -cons_type, -define +c.schema_name || '.' || b.table_name as table_id, +a.cons_name as FKId, +a.cons_type, +a.define, +(select c2.schema_name || '.' || b2.table_name from all_tables as b2 left join all_SCHEMAS as c2 on b2.SCHEMA_ID=c2.SCHEMA_ID where b2.TABLE_id=b.table_id) as ref_table_id from all_constraints as a left join all_tables as b on a.Table_ID=b.Table_ID left Join all_SCHEMAS AS c on b.SCHEMA_ID=c.SCHEMA_ID -where IS_SYS=false AND {loc8.ToString().Replace("a.table_name", "schema_name || '.' || b.table_name")} +where IS_SYS=false AND a.cons_type='F' AND {loc8.ToString().Replace("a.table_name", "schema_name || '.' || b.table_name")} "; ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); if (ds == null) return loc1; @@ -458,15 +459,31 @@ where IS_SYS=false AND {loc8.ToString().Replace("a.table_name", "schema_name || foreach (object[] row in ds) { var table_id = string.Concat(row[0]); - var column = row[3] as string[]; + var ref_table_id = string.Concat(row[4]); + //var ref_table_id = row[4] as long?; + //if (!ref_table_id.HasValue || ref_table_id < 1) + // continue; + + //loc2 是所有表信息 + + if (!string.IsNullOrWhiteSpace(ref_table_id) || loc2.ContainsKey(ref_table_id?.ToString()) == false) continue; + + + var column_temps = (row[3] as string) + .Replace(")(", "|") + .Replace("\"","") + .Replace("(", "") + .Replace(")", "") + .Split('|'); + var column = column_temps[0].Split(','); var fk_id = string.Concat(row[1]); - var ref_table_id = string.Concat(row[0]); - var is_foreign_key = string.Concat(row[2]) == "F"; - var referenced_column = row[5] as string[]; + + //var is_foreign_key = string.Concat(row[2]) == "F"; + var referenced_column = column_temps[1].Split(','); //var referenced_db = string.Concat(row[6]); //var referenced_table = string.Concat(row[7]); - if (loc2.ContainsKey(ref_table_id) == false) continue; + Dictionary loc12 = null; DbForeignInfo loc13 = null; From 85ab2b196effdc18c691ae46e51c0e62e60bf7e0 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 18 Apr 2023 00:43:18 +0800 Subject: [PATCH 07/58] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20=E9=83=A8?= =?UTF-8?q?=E5=88=86=20LocalExecuteScalar=20Aop.CommandAfter=20=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=EF=BC=9B#1481?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ClickHouseCodeFirst.cs | 17 +++++++++++++++-- .../MySql/CustomMySqlCodeFirst.cs | 15 ++++++++++++++- .../SqlServer/CustomSqlServerCodeFirst.cs | 15 ++++++++++++++- .../FreeSql.Provider.GBase/GBaseCodeFirst.cs | 15 ++++++++++++++- .../FreeSql.Provider.MySql/MySqlCodeFirst.cs | 15 ++++++++++++++- .../MySql/OdbcMySqlCodeFirst.cs | 15 ++++++++++++++- .../SqlServer/OdbcSqlServerCodeFirst.cs | 15 ++++++++++++++- .../SqlServerCodeFirst.cs | 15 ++++++++++++++- 8 files changed, 113 insertions(+), 9 deletions(-) diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs index c08debce..b71c024d 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs @@ -482,8 +482,21 @@ where a.database in ({0}) and a.table in ({1})", tboldname ?? tbname); cmd.CommandText = sql; cmd.CommandType = CommandType.Text; var before = new Aop.CommandBeforeEventArgs(cmd); - this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); - return cmd.ExecuteScalar(); + this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); + Exception afterException = null; + try + { + return cmd.ExecuteScalar(); + } + catch (Exception ex) + { + afterException = ex; + throw; + } + finally + { + this._orm?.Aop.CommandAfterHandler?.Invoke(this._orm, new Aop.CommandAfterEventArgs(before, afterException, null)); + } } } finally diff --git a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs index 6efb1899..61546848 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlCodeFirst.cs @@ -384,7 +384,20 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI cmd.CommandType = CommandType.Text; var before = new Aop.CommandBeforeEventArgs(cmd); this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); - return cmd.ExecuteScalar(); + Exception afterException = null; + try + { + return cmd.ExecuteScalar(); + } + catch (Exception ex) + { + afterException = ex; + throw; + } + finally + { + this._orm?.Aop.CommandAfterHandler?.Invoke(this._orm, new Aop.CommandAfterEventArgs(before, afterException, null)); + } } } finally diff --git a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerCodeFirst.cs b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerCodeFirst.cs index 15e66e4e..ed213e42 100644 --- a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerCodeFirst.cs @@ -476,7 +476,20 @@ use [" + database + "];", tboldname ?? tbname); cmd.CommandType = CommandType.Text; var before = new Aop.CommandBeforeEventArgs(cmd); this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); - return cmd.ExecuteScalar(); + Exception afterException = null; + try + { + return cmd.ExecuteScalar(); + } + catch (Exception ex) + { + afterException = ex; + throw; + } + finally + { + this._orm?.Aop.CommandAfterHandler?.Invoke(this._orm, new Aop.CommandAfterEventArgs(before, afterException, null)); + } } } finally diff --git a/Providers/FreeSql.Provider.GBase/GBaseCodeFirst.cs b/Providers/FreeSql.Provider.GBase/GBaseCodeFirst.cs index af79f04e..6ca4d16e 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseCodeFirst.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseCodeFirst.cs @@ -189,7 +189,20 @@ namespace FreeSql.GBase cmd.CommandType = CommandType.Text; var before = new Aop.CommandBeforeEventArgs(cmd); this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); - return cmd.ExecuteScalar(); + Exception afterException = null; + try + { + return cmd.ExecuteScalar(); + } + catch (Exception ex) + { + afterException = ex; + throw; + } + finally + { + this._orm?.Aop.CommandAfterHandler?.Invoke(this._orm, new Aop.CommandAfterEventArgs(before, afterException, null)); + } } } finally diff --git a/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs index 6a9fbb86..c70a0952 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs @@ -395,7 +395,20 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI cmd.CommandType = CommandType.Text; var before = new Aop.CommandBeforeEventArgs(cmd); this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); - return cmd.ExecuteScalar(); + Exception afterException = null; + try + { + return cmd.ExecuteScalar(); + } + catch (Exception ex) + { + afterException = ex; + throw; + } + finally + { + this._orm?.Aop.CommandAfterHandler?.Invoke(this._orm, new Aop.CommandAfterEventArgs(before, afterException, null)); + } } } finally diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs index 7825d5d8..d970d326 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlCodeFirst.cs @@ -385,7 +385,20 @@ where a.table_schema IN ({0}) and a.table_name IN ({1}) and a.index_name <> 'PRI cmd.CommandType = CommandType.Text; var before = new Aop.CommandBeforeEventArgs(cmd); this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); - return cmd.ExecuteScalar(); + Exception afterException = null; + try + { + return cmd.ExecuteScalar(); + } + catch (Exception ex) + { + afterException = ex; + throw; + } + finally + { + this._orm?.Aop.CommandAfterHandler?.Invoke(this._orm, new Aop.CommandAfterEventArgs(before, afterException, null)); + } } } finally diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs index 8445c9e9..5a5eef61 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs @@ -477,7 +477,20 @@ use [" + database + "];", tboldname ?? tbname); cmd.CommandType = CommandType.Text; var before = new Aop.CommandBeforeEventArgs(cmd); this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); - return cmd.ExecuteScalar(); + Exception afterException = null; + try + { + return cmd.ExecuteScalar(); + } + catch (Exception ex) + { + afterException = ex; + throw; + } + finally + { + this._orm?.Aop.CommandAfterHandler?.Invoke(this._orm, new Aop.CommandAfterEventArgs(before, afterException, null)); + } } } finally diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs index ae18b74e..859c5938 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs @@ -479,7 +479,20 @@ use [" + database + "];", tboldname ?? tbname); cmd.CommandType = CommandType.Text; var before = new Aop.CommandBeforeEventArgs(cmd); this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); - return cmd.ExecuteScalar(); + Exception afterException = null; + try + { + return cmd.ExecuteScalar(); + } + catch (Exception ex) + { + afterException = ex; + throw; + } + finally + { + this._orm?.Aop.CommandAfterHandler?.Invoke(this._orm, new Aop.CommandAfterEventArgs(before, afterException, null)); + } } } finally From e43aae4b188dafb320ee282791d25c86b0bdbf75 Mon Sep 17 00:00:00 2001 From: pigwing <35950090@qq.com> Date: Tue, 18 Apr 2023 12:36:37 +0800 Subject: [PATCH 08/58] =?UTF-8?q?SampleBy=E5=A2=9E=E5=8A=A0=E5=AF=B9?= =?UTF-8?q?=E5=87=86=E6=97=A5=E5=8E=86=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QuestDbGlobalExtensions.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Providers/FreeSql.Provider.QuestDb/QuestDbGlobalExtensions.cs b/Providers/FreeSql.Provider.QuestDb/QuestDbGlobalExtensions.cs index a6192657..aed7de90 100644 --- a/Providers/FreeSql.Provider.QuestDb/QuestDbGlobalExtensions.cs +++ b/Providers/FreeSql.Provider.QuestDb/QuestDbGlobalExtensions.cs @@ -111,13 +111,17 @@ public static partial class QuestDbGlobalExtensions /// /// 时长 /// 单位 + /// 对准日历 /// - public static ISelect SampleBy(this ISelect select, double time, SampleUnits unit) + public static ISelect SampleBy(this ISelect select, double time, SampleUnits unit, bool alignToCalendar = false) { var _unit = Enum.GetName(typeof(SampleUnits), unit); SampleByExtension.IsExistence.Value = true; - var samoleByTemple = $"{Environment.NewLine}SAMPLE BY {{0}}{{1}} "; - SampleByExtension.SamoleByString.Value = string.Format(samoleByTemple, time.ToString(), _unit); + var samoleByTemple = $"{Environment.NewLine}SAMPLE BY {{0}}{{1}} {{2}}"; + string alignToCalendarTemple = ""; + if (alignToCalendar) + alignToCalendarTemple = "ALIGN TO CALENDAR "; + SampleByExtension.SamoleByString.Value = string.Format(samoleByTemple, time.ToString(), _unit, alignToCalendarTemple); return select; } From 9d7ca7b8dfde79cf6fd89a82d1267f507cea5eb2 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Sun, 23 Apr 2023 00:30:46 +0800 Subject: [PATCH 09/58] rename File #1487 --- FreeSql/DatabaseModel/{DBColumnInfo.cs => DbColumnInfo1.cs} | 0 FreeSql/DatabaseModel/{DBTableInfo.cs => DbTableInfo1.cs} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename FreeSql/DatabaseModel/{DBColumnInfo.cs => DbColumnInfo1.cs} (100%) rename FreeSql/DatabaseModel/{DBTableInfo.cs => DbTableInfo1.cs} (100%) diff --git a/FreeSql/DatabaseModel/DBColumnInfo.cs b/FreeSql/DatabaseModel/DbColumnInfo1.cs similarity index 100% rename from FreeSql/DatabaseModel/DBColumnInfo.cs rename to FreeSql/DatabaseModel/DbColumnInfo1.cs diff --git a/FreeSql/DatabaseModel/DBTableInfo.cs b/FreeSql/DatabaseModel/DbTableInfo1.cs similarity index 100% rename from FreeSql/DatabaseModel/DBTableInfo.cs rename to FreeSql/DatabaseModel/DbTableInfo1.cs From b2ea1b56ee329ea14459c2212b8cd1d3fc198d6b Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Sun, 23 Apr 2023 00:31:04 +0800 Subject: [PATCH 10/58] rename File #1487 --- FreeSql/DatabaseModel/{DbColumnInfo1.cs => DbColumnInfo.cs} | 0 FreeSql/DatabaseModel/{DbTableInfo1.cs => DbTableInfo.cs} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename FreeSql/DatabaseModel/{DbColumnInfo1.cs => DbColumnInfo.cs} (100%) rename FreeSql/DatabaseModel/{DbTableInfo1.cs => DbTableInfo.cs} (100%) diff --git a/FreeSql/DatabaseModel/DbColumnInfo1.cs b/FreeSql/DatabaseModel/DbColumnInfo.cs similarity index 100% rename from FreeSql/DatabaseModel/DbColumnInfo1.cs rename to FreeSql/DatabaseModel/DbColumnInfo.cs diff --git a/FreeSql/DatabaseModel/DbTableInfo1.cs b/FreeSql/DatabaseModel/DbTableInfo.cs similarity index 100% rename from FreeSql/DatabaseModel/DbTableInfo1.cs rename to FreeSql/DatabaseModel/DbTableInfo.cs From 91da92b11fdbfbf156a688b5961a8904e161f370 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Mon, 24 Apr 2023 13:17:39 +0800 Subject: [PATCH 11/58] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=AE=9E=E4=BD=93API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/Extensions/CodeFirstExtensions.cs | 35 ++++ FreeSql/Internal/DynamicCompileBuilder.cs | 233 ++++++++++++++++++++++ 2 files changed, 268 insertions(+) create mode 100644 FreeSql/Extensions/CodeFirstExtensions.cs create mode 100644 FreeSql/Internal/DynamicCompileBuilder.cs diff --git a/FreeSql/Extensions/CodeFirstExtensions.cs b/FreeSql/Extensions/CodeFirstExtensions.cs new file mode 100644 index 00000000..f70f3bd7 --- /dev/null +++ b/FreeSql/Extensions/CodeFirstExtensions.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Text; +using FreeSql.Internal; + +namespace FreeSql.Extensions +{ +#if net40 || NETSTANDARD2_0 + //不支持 +#else + public static class CodeFirstExtensions + { + /// + /// 动态创建Class Type + /// + /// + public static DynamicCompileBuilder DynamicBuilder(this ICodeFirst codeFirst) + { + return new DynamicCompileBuilder(); + } + + /// + /// 根据动态构建的Class生成实例并进行属性赋值 + /// + /// + /// + /// + public static object CreateObjectByType(this ICodeFirst codeFirst, Type type, + Dictionary porpertys) + { + return DynamicCompileBuilder.CreateObjectByType(type, porpertys); + } + } +#endif +} diff --git a/FreeSql/Internal/DynamicCompileBuilder.cs b/FreeSql/Internal/DynamicCompileBuilder.cs new file mode 100644 index 00000000..16673161 --- /dev/null +++ b/FreeSql/Internal/DynamicCompileBuilder.cs @@ -0,0 +1,233 @@ +using FreeSql.DataAnnotations; +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Reflection.Emit; + +namespace FreeSql.Internal +{ +#if net40 || NETSTANDARD2_0 + +#else + public class DynamicCompileBuilder + { + private string _className = string.Empty; + private TableAttribute _tableAttribute = null; + private List _properties = new List(); + + /// + /// 配置Class + /// + /// 类名 + /// 类标记的特性[Table(Name = "xxx")] + /// + public DynamicCompileBuilder SetClass(string className, TableAttribute tableAttribute) + { + _className = className; + _tableAttribute = tableAttribute; + return this; + } + + /// + /// 配置属性 + /// + /// 属性名称 + /// 属性类型 + /// 属性标记的特性[Column(IsPrimary = true)] + /// + public DynamicCompileBuilder SetProperty(string propertyName, Type propertyType, ColumnAttribute columnAttribute) + { + _properties.Add(new DynamicPropertyInfo() + { + PropertyName = propertyName, + PropertyType = propertyType, + ColumnAttribute = columnAttribute + }); + return this; + } + + private void SetTableAttribute(ref TypeBuilder typeBuilder) + { + var classCtorInfo = typeof(TableAttribute).GetConstructor(new Type[] { }); + var propertyInfos = typeof(TableAttribute).GetProperties().Where(p => p.CanWrite == true).ToArray(); + if (_tableAttribute == null) + { + return; + } + + var propertyValues = new ArrayList(); + foreach (var propertyInfo in _tableAttribute.GetType().GetProperties().Where(p => p.CanWrite == true)) + { + propertyValues.Add(propertyInfo.GetValue(_tableAttribute)); + } + + var customAttributeBuilder = + new CustomAttributeBuilder(classCtorInfo, new object[0], propertyInfos, propertyValues.ToArray()); + typeBuilder.SetCustomAttribute(customAttributeBuilder); + } + + private void SetPropertys(ref TypeBuilder typeBuilder) + { + foreach (var pinfo in _properties) + { + var propertyName = pinfo.PropertyName; + var propertyType = pinfo?.PropertyType ?? typeof(object); + //设置字段 + var field = typeBuilder.DefineField($"_{FirstCharToLower(propertyName)}", propertyType, + FieldAttributes.Private); + var firstCharToUpper = FirstCharToUpper(propertyName); + //设置属性方法 + var methodGet = typeBuilder.DefineMethod($"Get{firstCharToUpper}", MethodAttributes.Public, + propertyType, null); + var methodSet = typeBuilder.DefineMethod($"Set{firstCharToUpper}", MethodAttributes.Public, null, + new Type[] { propertyType }); + + var ilOfGet = methodGet.GetILGenerator(); + ilOfGet.Emit(OpCodes.Ldarg_0); + ilOfGet.Emit(OpCodes.Ldfld, field); + ilOfGet.Emit(OpCodes.Ret); + + var ilOfSet = methodSet.GetILGenerator(); + ilOfSet.Emit(OpCodes.Ldarg_0); + ilOfSet.Emit(OpCodes.Ldarg_1); + ilOfSet.Emit(OpCodes.Stfld, field); + ilOfSet.Emit(OpCodes.Ret); + + //设置属性 + var propertyBuilder = + typeBuilder.DefineProperty(propertyName, PropertyAttributes.None, propertyType, null); + propertyBuilder.SetGetMethod(methodGet); + propertyBuilder.SetSetMethod(methodSet); + + //设置特性 + SetColumnAttribute(ref propertyBuilder, pinfo?.ColumnAttribute); + } + } + + private void SetColumnAttribute(ref PropertyBuilder propertyBuilder, ColumnAttribute columnAttribute = null) + { + if (columnAttribute == null) + return; + + var propertyValues = new ArrayList(); + foreach (var propertyInfo in columnAttribute.GetType().GetProperties().Where(p => p.CanWrite == true)) + { + propertyValues.Add(propertyInfo.GetValue(columnAttribute)); + } + + var propertyInfos = typeof(ColumnAttribute).GetProperties().Where(p => p.CanWrite == true).ToArray(); + var constructor = typeof(ColumnAttribute).GetConstructor(new Type[] { }); + var customAttributeBuilder = + new CustomAttributeBuilder(constructor, new object[0], propertyInfos, propertyValues.ToArray()); + propertyBuilder.SetCustomAttribute(customAttributeBuilder); + } + + /// + /// Emit动态创建出Class - Type + /// + /// + public Type Build() + { + //初始化AssemblyName的一个实例 + var assemblyName = new AssemblyName("FreeSql.DynamicCompileBuilder"); + //设置程序集的名称 + var defineDynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); + //动态在程序集内创建一个模块 + var defineDynamicModule = defineDynamicAssembly.DefineDynamicModule("FreeSql.DynamicCompileBuilder.Dynamics"); + //动态的在模块内创建一个类 + var typeBuilder = defineDynamicModule.DefineType(_className, TypeAttributes.Public | TypeAttributes.Class); + + //设置TableAttribute + SetTableAttribute(ref typeBuilder); + + //设置属性 + SetPropertys(ref typeBuilder); + + //创建类的Type对象 + return typeBuilder.CreateType(); + } + + //委托缓存 + private static ConcurrentDictionary + _delegateCache = new ConcurrentDictionary(); + + //设置动态对象的属性值 + public static object CreateObjectByType(Type type, Dictionary porpertys) + { + if (type == null) + return null; + object istance = Activator.CreateInstance(type); + if (istance == null) + return null; + //根据字典中的key确定缓存 + var cacheKey = string.Join("-", porpertys.Keys.OrderBy(s => s)); + var dynamicDelegate = _delegateCache.GetOrAdd(cacheKey, key => + { + //表达式目录树构建委托 + var typeParam = Expression.Parameter(type); + var dicParamType = typeof(Dictionary); + var dicParam = Expression.Parameter(dicParamType); + var exps = new List(); + var tempRef = Expression.Variable(typeof(object)); + foreach (var pinfo in porpertys) + { + var propertyInfo = type.GetProperty(pinfo.Key); + if (propertyInfo == null) + continue; + var propertyName = Expression.Constant(pinfo.Key, typeof(string)); + exps.Add(Expression.Call(dicParam, dicParamType.GetMethod("TryGetValue"), propertyName, tempRef)); + exps.Add(Expression.Assign(Expression.MakeMemberAccess(typeParam, propertyInfo), + Expression.Convert(tempRef, propertyInfo.PropertyType))); + exps.Add(Expression.Assign(tempRef, Expression.Default(typeof(object)))); + } + + var returnTarget = Expression.Label(type); + exps.Add(Expression.Return(returnTarget, typeParam)); + exps.Add(Expression.Label(returnTarget, Expression.Default(type))); + var block = Expression.Block(new[] { tempRef }, exps); + var @delegate = Expression.Lambda(block, typeParam, dicParam).Compile(); + return @delegate; + }); + var dynamicInvoke = dynamicDelegate.DynamicInvoke(istance, porpertys); + return dynamicInvoke; + } + + /// + /// 首字母小写 + /// + /// + /// + private string FirstCharToLower(string input) + { + if (string.IsNullOrEmpty(input)) + return input; + string str = input.First().ToString().ToLower() + input.Substring(1); + return str; + } + + /// + /// 首字母大写 + /// + /// + /// + private string FirstCharToUpper(string input) + { + if (string.IsNullOrEmpty(input)) + return input; + string str = input.First().ToString().ToUpper() + input.Substring(1); + return str; + } + } +#endif + internal class DynamicPropertyInfo + { + public string PropertyName { get; set; } = string.Empty; + public Type PropertyType { get; set; } = null; + public ColumnAttribute ColumnAttribute { get; set; } = null; + } +} + From 43a8e8bee9836ad5d12a6bcdc9696cd7eb0202fc Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Mon, 24 Apr 2023 14:28:45 +0800 Subject: [PATCH 12/58] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=AE=9E=E4=BD=93API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/Extensions/CodeFirstExtensions.cs | 7 ++-- FreeSql/FreeSql.xml | 51 +++++++++++++++++++++++ FreeSql/Internal/DynamicCompileBuilder.cs | 33 ++++++++------- 3 files changed, 73 insertions(+), 18 deletions(-) diff --git a/FreeSql/Extensions/CodeFirstExtensions.cs b/FreeSql/Extensions/CodeFirstExtensions.cs index f70f3bd7..e7f14b58 100644 --- a/FreeSql/Extensions/CodeFirstExtensions.cs +++ b/FreeSql/Extensions/CodeFirstExtensions.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Text; +using FreeSql.DataAnnotations; using FreeSql.Internal; namespace FreeSql.Extensions @@ -14,9 +15,9 @@ namespace FreeSql.Extensions /// 动态创建Class Type /// /// - public static DynamicCompileBuilder DynamicBuilder(this ICodeFirst codeFirst) + public static DynamicCompileBuilder DynamicEntity(this ICodeFirst codeFirst, string className, TableAttribute tableAttribute) { - return new DynamicCompileBuilder(); + return new DynamicCompileBuilder().SetClass(className, tableAttribute); } /// @@ -25,7 +26,7 @@ namespace FreeSql.Extensions /// /// /// - public static object CreateObjectByType(this ICodeFirst codeFirst, Type type, + public static object CreateDynamicEntityInstance(this Type type, Dictionary porpertys) { return DynamicCompileBuilder.CreateObjectByType(type, porpertys); diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 5323d7da..fef3c125 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1073,6 +1073,20 @@ + + + 动态创建Class Type + + + + + + 根据动态构建的Class生成实例并进行属性赋值 + + + + + 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -4248,6 +4262,43 @@ Dict:key=属性名,value=注释 + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性[Column(IsPrimary = true)] + + + + + Emit动态创建出Class - Type + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + 更新实体的元数据 diff --git a/FreeSql/Internal/DynamicCompileBuilder.cs b/FreeSql/Internal/DynamicCompileBuilder.cs index 16673161..99939f16 100644 --- a/FreeSql/Internal/DynamicCompileBuilder.cs +++ b/FreeSql/Internal/DynamicCompileBuilder.cs @@ -11,7 +11,7 @@ using System.Reflection.Emit; namespace FreeSql.Internal { #if net40 || NETSTANDARD2_0 - + #else public class DynamicCompileBuilder { @@ -37,15 +37,15 @@ namespace FreeSql.Internal /// /// 属性名称 /// 属性类型 - /// 属性标记的特性[Column(IsPrimary = true)] + /// 属性标记的特性[Column(IsPrimary = true)] /// - public DynamicCompileBuilder SetProperty(string propertyName, Type propertyType, ColumnAttribute columnAttribute) + public DynamicCompileBuilder Property(string propertyName, Type propertyType, params Attribute [] attributes) { _properties.Add(new DynamicPropertyInfo() { PropertyName = propertyName, - PropertyType = propertyType, - ColumnAttribute = columnAttribute + PropertyType = propertyType, + Attributes = attributes }); return this; } @@ -103,24 +103,27 @@ namespace FreeSql.Internal propertyBuilder.SetGetMethod(methodGet); propertyBuilder.SetSetMethod(methodSet); - //设置特性 - SetColumnAttribute(ref propertyBuilder, pinfo?.ColumnAttribute); + foreach (var pinfoAttribute in pinfo.Attributes) + { + //设置特性 + SetPropertyAttribute(ref propertyBuilder, pinfoAttribute); + } } } - private void SetColumnAttribute(ref PropertyBuilder propertyBuilder, ColumnAttribute columnAttribute = null) + private void SetPropertyAttribute(ref PropertyBuilder propertyBuilder, T tAttribute) { - if (columnAttribute == null) + if (tAttribute == null) return; var propertyValues = new ArrayList(); - foreach (var propertyInfo in columnAttribute.GetType().GetProperties().Where(p => p.CanWrite == true)) + foreach (var propertyInfo in tAttribute.GetType().GetProperties().Where(p => p.CanWrite == true)) { - propertyValues.Add(propertyInfo.GetValue(columnAttribute)); + propertyValues.Add(propertyInfo.GetValue(tAttribute)); } - var propertyInfos = typeof(ColumnAttribute).GetProperties().Where(p => p.CanWrite == true).ToArray(); - var constructor = typeof(ColumnAttribute).GetConstructor(new Type[] { }); + var propertyInfos = tAttribute.GetType().GetProperties().Where(p => p.CanWrite == true).ToArray(); + var constructor = tAttribute.GetType().GetConstructor(new Type[] { }); var customAttributeBuilder = new CustomAttributeBuilder(constructor, new object[0], propertyInfos, propertyValues.ToArray()); propertyBuilder.SetCustomAttribute(customAttributeBuilder); @@ -226,8 +229,8 @@ namespace FreeSql.Internal internal class DynamicPropertyInfo { public string PropertyName { get; set; } = string.Empty; - public Type PropertyType { get; set; } = null; - public ColumnAttribute ColumnAttribute { get; set; } = null; + public Type PropertyType { get; set; } + public Attribute [] Attributes { get; set; } } } From 958b6c220891b7abeca4a6f946602253e5406fae Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Mon, 24 Apr 2023 14:41:20 +0800 Subject: [PATCH 13/58] =?UTF-8?q?=E5=8A=A8=E6=80=81=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E8=A1=A8=E7=BB=93=E6=9E=84=E7=9B=B8=E5=85=B3=E7=9A=84API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/Extensions/CodeFirstExtensions.cs | 4 ++-- FreeSql/FreeSql.xml | 2 +- FreeSql/Internal/DynamicCompileBuilder.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/FreeSql/Extensions/CodeFirstExtensions.cs b/FreeSql/Extensions/CodeFirstExtensions.cs index e7f14b58..6ccf08c5 100644 --- a/FreeSql/Extensions/CodeFirstExtensions.cs +++ b/FreeSql/Extensions/CodeFirstExtensions.cs @@ -12,7 +12,7 @@ namespace FreeSql.Extensions public static class CodeFirstExtensions { /// - /// 动态创建Class Type + /// 动态构建Class Type /// /// public static DynamicCompileBuilder DynamicEntity(this ICodeFirst codeFirst, string className, TableAttribute tableAttribute) @@ -21,7 +21,7 @@ namespace FreeSql.Extensions } /// - /// 根据动态构建的Class生成实例并进行属性赋值 + /// 根据动态构建的Class Type生成实例并进行属性赋值 /// /// /// diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index fef3c125..f8ee6bd1 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1079,7 +1079,7 @@ - + 根据动态构建的Class生成实例并进行属性赋值 diff --git a/FreeSql/Internal/DynamicCompileBuilder.cs b/FreeSql/Internal/DynamicCompileBuilder.cs index 99939f16..4c93cdac 100644 --- a/FreeSql/Internal/DynamicCompileBuilder.cs +++ b/FreeSql/Internal/DynamicCompileBuilder.cs @@ -37,7 +37,7 @@ namespace FreeSql.Internal /// /// 属性名称 /// 属性类型 - /// 属性标记的特性[Column(IsPrimary = true)] + /// 属性标记的特性-支持多个 /// public DynamicCompileBuilder Property(string propertyName, Type propertyType, params Attribute [] attributes) { From 39feb6464631a51b3e477bb4fa67309b1636082b Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 25 Apr 2023 10:26:18 +0800 Subject: [PATCH 14/58] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Type=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/Extensions/TypeExtensions.cs | 40 ++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 FreeSql/Extensions/TypeExtensions.cs diff --git a/FreeSql/Extensions/TypeExtensions.cs b/FreeSql/Extensions/TypeExtensions.cs new file mode 100644 index 00000000..a5b75fd8 --- /dev/null +++ b/FreeSql/Extensions/TypeExtensions.cs @@ -0,0 +1,40 @@ +using FreeSql.Internal; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace DynamicBuilder +{ +#if net40 || NETSTANDARD2_0 +#else + public static class TypeExtensions + { + /// + /// 根据动态构建的Class Type生成实例并进行属性赋值 + /// + /// + /// + /// + public static object CreateDynamicEntityInstance(this Type type, IFreeSql fsql, + Dictionary porpertys) + { + return DynamicCompileBuilder.CreateObjectByTypeByCodeFirst(fsql, type, porpertys); + } + + /// + /// 设置对象属性值 + /// + /// + /// + public static void SetPropertyValue(this Type type, IFreeSql fsql, ref object obj, string propertyName, + object propertyValue) + { + var table = fsql.CodeFirst.GetTableByEntity(obj.GetType()); + table.ColumnsByCs[propertyName].SetValue(obj, propertyValue); + } + } +#endif +} From c012c166d80b49dbf0751504455f5a82761b4d2e Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 25 Apr 2023 10:26:39 +0800 Subject: [PATCH 15/58] =?UTF-8?q?=E8=B0=83=E6=95=B4CodeFirst=E6=89=A9?= =?UTF-8?q?=E5=B1=95=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/Extensions/CodeFirstExtensions.cs | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/FreeSql/Extensions/CodeFirstExtensions.cs b/FreeSql/Extensions/CodeFirstExtensions.cs index 6ccf08c5..818be04c 100644 --- a/FreeSql/Extensions/CodeFirstExtensions.cs +++ b/FreeSql/Extensions/CodeFirstExtensions.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Reflection; using System.Text; using FreeSql.DataAnnotations; using FreeSql.Internal; @@ -7,30 +8,19 @@ using FreeSql.Internal; namespace FreeSql.Extensions { #if net40 || NETSTANDARD2_0 - //不支持 #else - public static class CodeFirstExtensions + public static class CodeFirstExtensions { /// /// 动态构建Class Type /// /// - public static DynamicCompileBuilder DynamicEntity(this ICodeFirst codeFirst, string className, TableAttribute tableAttribute) + public static DynamicCompileBuilder DynamicEntity(this ICodeFirst codeFirst, string className, + TableAttribute tableAttribute) { return new DynamicCompileBuilder().SetClass(className, tableAttribute); } - /// - /// 根据动态构建的Class Type生成实例并进行属性赋值 - /// - /// - /// - /// - public static object CreateDynamicEntityInstance(this Type type, - Dictionary porpertys) - { - return DynamicCompileBuilder.CreateObjectByType(type, porpertys); - } } #endif -} +} \ No newline at end of file From 1753a51b427744e33bc58f53ddeb9f6a3fa0fc1f Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 25 Apr 2023 10:27:09 +0800 Subject: [PATCH 16/58] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=B5=8B=E5=80=BC=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/Internal/DynamicCompileBuilder.cs | 54 ++++++++++++++++++----- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/FreeSql/Internal/DynamicCompileBuilder.cs b/FreeSql/Internal/DynamicCompileBuilder.cs index 4c93cdac..c857eb74 100644 --- a/FreeSql/Internal/DynamicCompileBuilder.cs +++ b/FreeSql/Internal/DynamicCompileBuilder.cs @@ -7,13 +7,15 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Reflection.Emit; +using System.Security.Cryptography; +using FreeSql.Internal.Model; +using System.Text; namespace FreeSql.Internal { #if net40 || NETSTANDARD2_0 - #else - public class DynamicCompileBuilder + public class DynamicCompileBuilder { private string _className = string.Empty; private TableAttribute _tableAttribute = null; @@ -39,12 +41,12 @@ namespace FreeSql.Internal /// 属性类型 /// 属性标记的特性-支持多个 /// - public DynamicCompileBuilder Property(string propertyName, Type propertyType, params Attribute [] attributes) + public DynamicCompileBuilder Property(string propertyName, Type propertyType, params Attribute[] attributes) { _properties.Add(new DynamicPropertyInfo() { PropertyName = propertyName, - PropertyType = propertyType, + PropertyType = propertyType, Attributes = attributes }); return this; @@ -140,7 +142,8 @@ namespace FreeSql.Internal //设置程序集的名称 var defineDynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); //动态在程序集内创建一个模块 - var defineDynamicModule = defineDynamicAssembly.DefineDynamicModule("FreeSql.DynamicCompileBuilder.Dynamics"); + var defineDynamicModule = + defineDynamicAssembly.DefineDynamicModule("FreeSql.DynamicCompileBuilder.Dynamics"); //动态的在模块内创建一个类 var typeBuilder = defineDynamicModule.DefineType(_className, TypeAttributes.Public | TypeAttributes.Class); @@ -158,7 +161,25 @@ namespace FreeSql.Internal private static ConcurrentDictionary _delegateCache = new ConcurrentDictionary(); - //设置动态对象的属性值 + //设置动态对象的属性值 使用FreeSql自带功能 + public static object CreateObjectByTypeByCodeFirst(IFreeSql fsql, Type type, + Dictionary porpertys) + { + if (type == null) + return null; + object istance = Activator.CreateInstance(type); + if (istance == null) + return null; + var table = fsql.CodeFirst.GetTableByEntity(type); + foreach (var kv in porpertys) + { + table.ColumnsByCs[kv.Key].SetValue(istance, kv.Value); + } + + return istance; + } + + //设置动态对象的属性值,使用表达式目录树 public static object CreateObjectByType(Type type, Dictionary porpertys) { if (type == null) @@ -167,7 +188,8 @@ namespace FreeSql.Internal if (istance == null) return null; //根据字典中的key确定缓存 - var cacheKey = string.Join("-", porpertys.Keys.OrderBy(s => s)); + var cacheKeyStr = string.Join("-", porpertys.Keys.OrderBy(s => s)); + var cacheKey = Md5Encryption(cacheKeyStr); var dynamicDelegate = _delegateCache.GetOrAdd(cacheKey, key => { //表达式目录树构建委托 @@ -224,13 +246,25 @@ namespace FreeSql.Internal string str = input.First().ToString().ToUpper() + input.Substring(1); return str; } + + private static string Md5Encryption(string inputStr) + { + var result = string.Empty; + //32位大写 + using (var md5 = MD5.Create()) + { + var resultBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(inputStr)); + result = BitConverter.ToString(resultBytes); + } + + return result; + } } #endif internal class DynamicPropertyInfo { public string PropertyName { get; set; } = string.Empty; public Type PropertyType { get; set; } - public Attribute [] Attributes { get; set; } + public Attribute[] Attributes { get; set; } } -} - +} \ No newline at end of file From 8bd85ebe22d7fa3e3a600892d9580a14fdd835e7 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 25 Apr 2023 10:28:19 +0800 Subject: [PATCH 17/58] =?UTF-8?q?=E5=8A=A8=E6=80=81=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E8=A1=A8=E7=BB=93=E6=9E=84=E7=9B=B8=E5=85=B3=E7=9A=84API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/FreeSql.xml | 51 --------------------------------------------- 1 file changed, 51 deletions(-) diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index f8ee6bd1..5323d7da 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1073,20 +1073,6 @@ - - - 动态创建Class Type - - - - - - 根据动态构建的Class生成实例并进行属性赋值 - - - - - 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -4262,43 +4248,6 @@ Dict:key=属性名,value=注释 - - - 配置Class - - 类名 - 类标记的特性[Table(Name = "xxx")] - - - - - 配置属性 - - 属性名称 - 属性类型 - 属性标记的特性[Column(IsPrimary = true)] - - - - - Emit动态创建出Class - Type - - - - - - 首字母小写 - - - - - - - 首字母大写 - - - - 更新实体的元数据 From 5046907e4f06776998e04623ce34356696685aa1 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 25 Apr 2023 10:29:08 +0800 Subject: [PATCH 18/58] =?UTF-8?q?=E5=8A=A8=E6=80=81=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E8=A1=A8=E7=BB=93=E6=9E=84=E7=9B=B8=E5=85=B3=E7=9A=84API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/Internal/DynamicCompileBuilder.cs | 80 +++++++++++------------ 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/FreeSql/Internal/DynamicCompileBuilder.cs b/FreeSql/Internal/DynamicCompileBuilder.cs index c857eb74..7c6feba8 100644 --- a/FreeSql/Internal/DynamicCompileBuilder.cs +++ b/FreeSql/Internal/DynamicCompileBuilder.cs @@ -179,47 +179,47 @@ namespace FreeSql.Internal return istance; } - //设置动态对象的属性值,使用表达式目录树 - public static object CreateObjectByType(Type type, Dictionary porpertys) - { - if (type == null) - return null; - object istance = Activator.CreateInstance(type); - if (istance == null) - return null; - //根据字典中的key确定缓存 - var cacheKeyStr = string.Join("-", porpertys.Keys.OrderBy(s => s)); - var cacheKey = Md5Encryption(cacheKeyStr); - var dynamicDelegate = _delegateCache.GetOrAdd(cacheKey, key => - { - //表达式目录树构建委托 - var typeParam = Expression.Parameter(type); - var dicParamType = typeof(Dictionary); - var dicParam = Expression.Parameter(dicParamType); - var exps = new List(); - var tempRef = Expression.Variable(typeof(object)); - foreach (var pinfo in porpertys) - { - var propertyInfo = type.GetProperty(pinfo.Key); - if (propertyInfo == null) - continue; - var propertyName = Expression.Constant(pinfo.Key, typeof(string)); - exps.Add(Expression.Call(dicParam, dicParamType.GetMethod("TryGetValue"), propertyName, tempRef)); - exps.Add(Expression.Assign(Expression.MakeMemberAccess(typeParam, propertyInfo), - Expression.Convert(tempRef, propertyInfo.PropertyType))); - exps.Add(Expression.Assign(tempRef, Expression.Default(typeof(object)))); - } + ////设置动态对象的属性值,使用表达式目录树 + //public static object CreateObjectByType(Type type, Dictionary porpertys) + //{ + // if (type == null) + // return null; + // object istance = Activator.CreateInstance(type); + // if (istance == null) + // return null; + // //根据字典中的key确定缓存 + // var cacheKeyStr = string.Join("-", porpertys.Keys.OrderBy(s => s)); + // var cacheKey = Md5Encryption(cacheKeyStr); + // var dynamicDelegate = _delegateCache.GetOrAdd(cacheKey, key => + // { + // //表达式目录树构建委托 + // var typeParam = Expression.Parameter(type); + // var dicParamType = typeof(Dictionary); + // var dicParam = Expression.Parameter(dicParamType); + // var exps = new List(); + // var tempRef = Expression.Variable(typeof(object)); + // foreach (var pinfo in porpertys) + // { + // var propertyInfo = type.GetProperty(pinfo.Key); + // if (propertyInfo == null) + // continue; + // var propertyName = Expression.Constant(pinfo.Key, typeof(string)); + // exps.Add(Expression.Call(dicParam, dicParamType.GetMethod("TryGetValue"), propertyName, tempRef)); + // exps.Add(Expression.Assign(Expression.MakeMemberAccess(typeParam, propertyInfo), + // Expression.Convert(tempRef, propertyInfo.PropertyType))); + // exps.Add(Expression.Assign(tempRef, Expression.Default(typeof(object)))); + // } - var returnTarget = Expression.Label(type); - exps.Add(Expression.Return(returnTarget, typeParam)); - exps.Add(Expression.Label(returnTarget, Expression.Default(type))); - var block = Expression.Block(new[] { tempRef }, exps); - var @delegate = Expression.Lambda(block, typeParam, dicParam).Compile(); - return @delegate; - }); - var dynamicInvoke = dynamicDelegate.DynamicInvoke(istance, porpertys); - return dynamicInvoke; - } + // var returnTarget = Expression.Label(type); + // exps.Add(Expression.Return(returnTarget, typeParam)); + // exps.Add(Expression.Label(returnTarget, Expression.Default(type))); + // var block = Expression.Block(new[] { tempRef }, exps); + // var @delegate = Expression.Lambda(block, typeParam, dicParam).Compile(); + // return @delegate; + // }); + // var dynamicInvoke = dynamicDelegate.DynamicInvoke(istance, porpertys); + // return dynamicInvoke; + //} /// /// 首字母小写 From f8866f2479b5ed4843c6360ad77057480578750d Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 25 Apr 2023 10:29:24 +0800 Subject: [PATCH 19/58] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E8=A1=A8=E7=BB=93=E6=9E=84=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E7=9A=84API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/Internal/DynamicCompileBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeSql/Internal/DynamicCompileBuilder.cs b/FreeSql/Internal/DynamicCompileBuilder.cs index 7c6feba8..9dfdd0cf 100644 --- a/FreeSql/Internal/DynamicCompileBuilder.cs +++ b/FreeSql/Internal/DynamicCompileBuilder.cs @@ -179,7 +179,7 @@ namespace FreeSql.Internal return istance; } - ////设置动态对象的属性值,使用表达式目录树 + ////设置动态对象的属性值,使用表达式目录树 //public static object CreateObjectByType(Type type, Dictionary porpertys) //{ // if (type == null) From 235a2c26363025b5ee481e10c7b910f026df3966 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 4 May 2023 21:46:11 +0800 Subject: [PATCH 20/58] =?UTF-8?q?-=20=E5=8A=A8=E6=80=81=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E8=A1=A8=E7=BB=93=E6=9E=84=E7=9B=B8=E5=85=B3=E7=9A=84=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/Extensions/CodeFirstExtensions.cs | 26 -------- FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 15 +++++ FreeSql/Extensions/TypeExtensions.cs | 40 ------------ FreeSql/Internal/DynamicCompileBuilder.cs | 64 +++++++++---------- 4 files changed, 44 insertions(+), 101 deletions(-) delete mode 100644 FreeSql/Extensions/CodeFirstExtensions.cs delete mode 100644 FreeSql/Extensions/TypeExtensions.cs diff --git a/FreeSql/Extensions/CodeFirstExtensions.cs b/FreeSql/Extensions/CodeFirstExtensions.cs deleted file mode 100644 index 818be04c..00000000 --- a/FreeSql/Extensions/CodeFirstExtensions.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Reflection; -using System.Text; -using FreeSql.DataAnnotations; -using FreeSql.Internal; - -namespace FreeSql.Extensions -{ -#if net40 || NETSTANDARD2_0 -#else - public static class CodeFirstExtensions - { - /// - /// 动态构建Class Type - /// - /// - public static DynamicCompileBuilder DynamicEntity(this ICodeFirst codeFirst, string className, - TableAttribute tableAttribute) - { - return new DynamicCompileBuilder().SetClass(className, tableAttribute); - } - - } -#endif -} \ No newline at end of file diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index 12012b83..06db0959 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -1,5 +1,6 @@ using FreeSql; using FreeSql.DataAnnotations; +using FreeSql.Internal; using FreeSql.Internal.CommonProvider; using FreeSql.Internal.Model; using FreeSql.Internal.ObjectPool; @@ -1299,4 +1300,18 @@ SELECT "); return NativeTuple.Create(query, af, sql); } #endregion + + #region DynamicEntity +#if net40 || NETSTANDARD2_0 +#else + /// + /// 动态构建Class Type + /// + /// + public static DynamicCompileBuilder DynamicEntity(this ICodeFirst codeFirst, string className, TableAttribute tableAttribute) + { + return new DynamicCompileBuilder(className, tableAttribute); + } +#endif + #endregion } diff --git a/FreeSql/Extensions/TypeExtensions.cs b/FreeSql/Extensions/TypeExtensions.cs deleted file mode 100644 index a5b75fd8..00000000 --- a/FreeSql/Extensions/TypeExtensions.cs +++ /dev/null @@ -1,40 +0,0 @@ -using FreeSql.Internal; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; - -namespace DynamicBuilder -{ -#if net40 || NETSTANDARD2_0 -#else - public static class TypeExtensions - { - /// - /// 根据动态构建的Class Type生成实例并进行属性赋值 - /// - /// - /// - /// - public static object CreateDynamicEntityInstance(this Type type, IFreeSql fsql, - Dictionary porpertys) - { - return DynamicCompileBuilder.CreateObjectByTypeByCodeFirst(fsql, type, porpertys); - } - - /// - /// 设置对象属性值 - /// - /// - /// - public static void SetPropertyValue(this Type type, IFreeSql fsql, ref object obj, string propertyName, - object propertyValue) - { - var table = fsql.CodeFirst.GetTableByEntity(obj.GetType()); - table.ColumnsByCs[propertyName].SetValue(obj, propertyValue); - } - } -#endif -} diff --git a/FreeSql/Internal/DynamicCompileBuilder.cs b/FreeSql/Internal/DynamicCompileBuilder.cs index 9dfdd0cf..fb4903de 100644 --- a/FreeSql/Internal/DynamicCompileBuilder.cs +++ b/FreeSql/Internal/DynamicCompileBuilder.cs @@ -18,20 +18,19 @@ namespace FreeSql.Internal public class DynamicCompileBuilder { private string _className = string.Empty; - private TableAttribute _tableAttribute = null; + private Attribute[] _tableAttributes = null; private List _properties = new List(); /// /// 配置Class /// /// 类名 - /// 类标记的特性[Table(Name = "xxx")] + /// 类标记的特性[Table(Name = "xxx")] /// - public DynamicCompileBuilder SetClass(string className, TableAttribute tableAttribute) + public DynamicCompileBuilder(string className, params Attribute[] attributes) { _className = className; - _tableAttribute = tableAttribute; - return this; + _tableAttributes = attributes; } /// @@ -54,22 +53,21 @@ namespace FreeSql.Internal private void SetTableAttribute(ref TypeBuilder typeBuilder) { - var classCtorInfo = typeof(TableAttribute).GetConstructor(new Type[] { }); - var propertyInfos = typeof(TableAttribute).GetProperties().Where(p => p.CanWrite == true).ToArray(); - if (_tableAttribute == null) - { - return; - } + if (_tableAttributes == null) return; var propertyValues = new ArrayList(); - foreach (var propertyInfo in _tableAttribute.GetType().GetProperties().Where(p => p.CanWrite == true)) + foreach (var tableAttribute in _tableAttributes) { - propertyValues.Add(propertyInfo.GetValue(_tableAttribute)); - } + if (tableAttribute == null) continue; - var customAttributeBuilder = - new CustomAttributeBuilder(classCtorInfo, new object[0], propertyInfos, propertyValues.ToArray()); - typeBuilder.SetCustomAttribute(customAttributeBuilder); + var classCtorInfo = tableAttribute.GetType().GetConstructor(new Type[] { }); + var propertyInfos = tableAttribute.GetType().GetProperties().Where(p => p.CanWrite == true).ToArray(); + foreach (var propertyInfo in propertyInfos) + propertyValues.Add(propertyInfo.GetValue(tableAttribute)); + + var customAttributeBuilder = new CustomAttributeBuilder(classCtorInfo, new object[0], propertyInfos, propertyValues.ToArray()); + typeBuilder.SetCustomAttribute(customAttributeBuilder); + } } private void SetPropertys(ref TypeBuilder typeBuilder) @@ -100,8 +98,7 @@ namespace FreeSql.Internal ilOfSet.Emit(OpCodes.Ret); //设置属性 - var propertyBuilder = - typeBuilder.DefineProperty(propertyName, PropertyAttributes.None, propertyType, null); + var propertyBuilder = typeBuilder.DefineProperty(propertyName, PropertyAttributes.None, propertyType, null); propertyBuilder.SetGetMethod(methodGet); propertyBuilder.SetSetMethod(methodSet); @@ -115,19 +112,15 @@ namespace FreeSql.Internal private void SetPropertyAttribute(ref PropertyBuilder propertyBuilder, T tAttribute) { - if (tAttribute == null) - return; - - var propertyValues = new ArrayList(); - foreach (var propertyInfo in tAttribute.GetType().GetProperties().Where(p => p.CanWrite == true)) - { - propertyValues.Add(propertyInfo.GetValue(tAttribute)); - } + if (tAttribute == null) return; var propertyInfos = tAttribute.GetType().GetProperties().Where(p => p.CanWrite == true).ToArray(); var constructor = tAttribute.GetType().GetConstructor(new Type[] { }); - var customAttributeBuilder = - new CustomAttributeBuilder(constructor, new object[0], propertyInfos, propertyValues.ToArray()); + var propertyValues = new ArrayList(); + foreach (var propertyInfo in propertyInfos) + propertyValues.Add(propertyInfo.GetValue(tAttribute)); + + var customAttributeBuilder = new CustomAttributeBuilder(constructor, new object[0], propertyInfos, propertyValues.ToArray()); propertyBuilder.SetCustomAttribute(customAttributeBuilder); } @@ -259,12 +252,13 @@ namespace FreeSql.Internal return result; } + + class DynamicPropertyInfo + { + public string PropertyName { get; set; } = string.Empty; + public Type PropertyType { get; set; } + public Attribute[] Attributes { get; set; } + } } #endif - internal class DynamicPropertyInfo - { - public string PropertyName { get; set; } = string.Empty; - public Type PropertyType { get; set; } - public Attribute[] Attributes { get; set; } - } } \ No newline at end of file From 8ab7e76f14ff4f460456c14a5d55de54545a2ea3 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 4 May 2023 22:37:03 +0800 Subject: [PATCH 21/58] v3.2.694 #1497 #1487 #1481 #1483 #1477 #1502 #1501 --- Directory.Build.props | 2 +- Examples/base_entity/Program.cs | 38 ++++++++++++++++ .../FreeSql.Extensions.AggregateRoot.csproj | 2 +- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- .../FreeSql.Extensions.Linq.csproj | 2 +- .../FreeSql.Generator.csproj | 2 +- FreeSql.All/FreeSql.All.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.xml | 9 ---- FreeSql.Repository/FreeSql.Repository.csproj | 2 +- FreeSql/FreeSql.csproj | 2 +- FreeSql/FreeSql.xml | 43 +++++++++++++++++++ .../FreeSql.Provider.ClickHouse.csproj | 2 +- .../FreeSql.Provider.Custom.csproj | 2 +- .../FreeSql.Provider.Dameng.csproj | 2 +- .../FreeSql.Provider.Firebird.csproj | 2 +- .../FreeSql.Provider.GBase.csproj | 2 +- .../FreeSql.Provider.KingbaseES.csproj | 2 +- .../FreeSql.Provider.MsAccess.csproj | 2 +- .../FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- .../FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.OracleOledb.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.QuestDb.csproj | 2 +- .../FreeSql.Provider.ShenTong.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- ...FreeSql.Provider.SqlServerForSystem.csproj | 2 +- .../FreeSql.Provider.Sqlite.csproj | 2 +- .../FreeSql.Provider.SqliteCore.csproj | 2 +- .../FreeSql.Provider.Xugu.csproj | 2 +- 34 files changed, 112 insertions(+), 40 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 95cd47d2..4dd4f9c6 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 7370ff02..70e6687b 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -577,6 +577,24 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + var isusers01 = fsql.Select() + .Where(e => e.Property("项目执行情况") == "结题") + .GroupBy(e => new { ProjectLevel = e.Property("项目级别") }) + .ToSql(e => new + { + e.Key.ProjectLevel, + Test = e.Value.Group.Property("批准经费总额(万元)"), + }); + isusers01 = fsql.Select() + .Where(e => e.Property("项目执行情况") == "结题") + .GroupBy(e => new { ProjectLevel = e.Property("项目级别") }) + .WithTempQuery(e => new + { + e.Key.ProjectLevel, + Test = e.Value.Group.Property("批准经费总额(万元)"), + }) + .ToSql(); + var bulkUsers = new[] { new IdentityUser1 { Nickname = "nickname11", Username = "username11" }, new IdentityUser1 { Nickname = "nickname12", Username = "username12" }, @@ -2116,4 +2134,24 @@ namespace base_entity public string GoodsNo { get; set; } public string GoodsName { get; set; } } + + [ExpressionCall] + public static class AchievementExpressionExtension + { + static ThreadLocal context = new ThreadLocal(); + public static string Property(this Achievement achievement, string fieldName) + { + var ctx = context.Value; + var prefix = ctx.ParsedContent["achievement"]; + prefix = prefix.Substring(0, prefix.IndexOf('.') + 1); + ctx.Result = prefix + $"`{fieldName}`"; + return default; + } + } + [Table(DisableSyncStructure = true)] + public class Achievement + { + [Column(MapType = typeof(string))] + public Achievement Group { get; set; } + } } diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index 267354bd..1e502027 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index 52550156..9242ecca 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.694-preview20230331 + 3.2.694 diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index f7b4ca7b..e35f408e 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index df52e3ed..02a84304 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.694-preview20230331 + 3.2.694 diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index 9ee44b91..ccb9fbd4 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 6276bbda..0b77520c 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.694-preview20230331 + 3.2.694 diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index f6f6d7b7..7f5672c8 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 2cce5dac..2661d8d6 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 26522f10..537315e2 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -800,14 +800,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 606b3c17..016585b3 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index b02fbcea..b3a6be7e 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 5323d7da..1eab8ccc 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -4248,6 +4248,43 @@ Dict:key=属性名,value=注释 + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性-支持多个 + + + + + Emit动态创建出Class - Type + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + 更新实体的元数据 @@ -5869,6 +5906,12 @@ + + + 动态构建Class Type + + + 使用 and 拼接两个 lambda 表达式 diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index 41646e90..617cb6fa 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index 77f43070..4c978c13 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index 04fa3a11..f55fae61 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index 3d0c20e0..5ba2819c 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 2c4e4216..58d191f1 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index 17bf46d9..820fbf23 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index 4d2ab5e2..528adf18 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index e12f2f17..4e124b6b 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 5384b7bf..dbe3c4d9 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index f7ea682b..37e51e4d 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 88955ae4..f323c4a8 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index 7b077423..68ca179d 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index 1813c4ed..f994cdaf 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index 7aa82247..5ea2e720 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index d58374cc..01de7738 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index a16ef450..3785c10c 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index 0d913e3f..1302f57f 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index acc398f0..6a196a59 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index a2eca6e8..1150c21c 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694-preview20230331 + 3.2.694 diff --git a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj index dd329c0b..86020339 100644 --- a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj +++ b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.694-preview20230331 + 3.2.694 From 48724cd302199514fce8faf059e056aa5f74026f Mon Sep 17 00:00:00 2001 From: "Mr.T" Date: Fri, 5 May 2023 09:12:28 +0800 Subject: [PATCH 22/58] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BD=BF=E7=94=A8Sqlit?= =?UTF-8?q?eCore=E5=8C=85=E6=97=A0=E6=B3=95=E4=BD=BF=E7=94=A8GetCrud?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/Extensions/AdoNetExtensions.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/FreeSql/Extensions/AdoNetExtensions.cs b/FreeSql/Extensions/AdoNetExtensions.cs index 51c7e196..ed46fd09 100644 --- a/FreeSql/Extensions/AdoNetExtensions.cs +++ b/FreeSql/Extensions/AdoNetExtensions.cs @@ -40,8 +40,9 @@ namespace FreeSql if (providerType == null) throw new Exception(CoreStrings.Missing_FreeSqlProvider_Package("Oracle")); break; case "SQLiteConnection": + case "SqliteConnection": providerType = Type.GetType("FreeSql.Sqlite.SqliteProvider`1,FreeSql.Provider.Sqlite")?.MakeGenericType(connType); - if (providerType == null) throw new Exception(CoreStrings.Missing_FreeSqlProvider_Package("Sqlite")); + if (providerType == null) throw new Exception(CoreStrings.Missing_FreeSqlProvider_Package("Sqlite/SqliteCore")); break; case "DmConnection": providerType = Type.GetType("FreeSql.Dameng.DamengProvider`1,FreeSql.Provider.Dameng")?.MakeGenericType(connType); @@ -423,4 +424,4 @@ namespace FreeSql #endregion } -} \ No newline at end of file +} From b290d8a2d345c567cba04c7041d8c8781339c198 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Fri, 5 May 2023 10:52:03 +0800 Subject: [PATCH 23/58] =?UTF-8?q?-=20DynamicEntity=E6=8B=86=E5=88=86?= =?UTF-8?q?=E7=8B=AC=E7=AB=8Bnuget=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/Internal/DynamicCompileBuilder.cs | 264 ---------------------- 1 file changed, 264 deletions(-) delete mode 100644 FreeSql/Internal/DynamicCompileBuilder.cs diff --git a/FreeSql/Internal/DynamicCompileBuilder.cs b/FreeSql/Internal/DynamicCompileBuilder.cs deleted file mode 100644 index fb4903de..00000000 --- a/FreeSql/Internal/DynamicCompileBuilder.cs +++ /dev/null @@ -1,264 +0,0 @@ -using FreeSql.DataAnnotations; -using System; -using System.Collections; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using System.Reflection.Emit; -using System.Security.Cryptography; -using FreeSql.Internal.Model; -using System.Text; - -namespace FreeSql.Internal -{ -#if net40 || NETSTANDARD2_0 -#else - public class DynamicCompileBuilder - { - private string _className = string.Empty; - private Attribute[] _tableAttributes = null; - private List _properties = new List(); - - /// - /// 配置Class - /// - /// 类名 - /// 类标记的特性[Table(Name = "xxx")] - /// - public DynamicCompileBuilder(string className, params Attribute[] attributes) - { - _className = className; - _tableAttributes = attributes; - } - - /// - /// 配置属性 - /// - /// 属性名称 - /// 属性类型 - /// 属性标记的特性-支持多个 - /// - public DynamicCompileBuilder Property(string propertyName, Type propertyType, params Attribute[] attributes) - { - _properties.Add(new DynamicPropertyInfo() - { - PropertyName = propertyName, - PropertyType = propertyType, - Attributes = attributes - }); - return this; - } - - private void SetTableAttribute(ref TypeBuilder typeBuilder) - { - if (_tableAttributes == null) return; - - var propertyValues = new ArrayList(); - foreach (var tableAttribute in _tableAttributes) - { - if (tableAttribute == null) continue; - - var classCtorInfo = tableAttribute.GetType().GetConstructor(new Type[] { }); - var propertyInfos = tableAttribute.GetType().GetProperties().Where(p => p.CanWrite == true).ToArray(); - foreach (var propertyInfo in propertyInfos) - propertyValues.Add(propertyInfo.GetValue(tableAttribute)); - - var customAttributeBuilder = new CustomAttributeBuilder(classCtorInfo, new object[0], propertyInfos, propertyValues.ToArray()); - typeBuilder.SetCustomAttribute(customAttributeBuilder); - } - } - - private void SetPropertys(ref TypeBuilder typeBuilder) - { - foreach (var pinfo in _properties) - { - var propertyName = pinfo.PropertyName; - var propertyType = pinfo?.PropertyType ?? typeof(object); - //设置字段 - var field = typeBuilder.DefineField($"_{FirstCharToLower(propertyName)}", propertyType, - FieldAttributes.Private); - var firstCharToUpper = FirstCharToUpper(propertyName); - //设置属性方法 - var methodGet = typeBuilder.DefineMethod($"Get{firstCharToUpper}", MethodAttributes.Public, - propertyType, null); - var methodSet = typeBuilder.DefineMethod($"Set{firstCharToUpper}", MethodAttributes.Public, null, - new Type[] { propertyType }); - - var ilOfGet = methodGet.GetILGenerator(); - ilOfGet.Emit(OpCodes.Ldarg_0); - ilOfGet.Emit(OpCodes.Ldfld, field); - ilOfGet.Emit(OpCodes.Ret); - - var ilOfSet = methodSet.GetILGenerator(); - ilOfSet.Emit(OpCodes.Ldarg_0); - ilOfSet.Emit(OpCodes.Ldarg_1); - ilOfSet.Emit(OpCodes.Stfld, field); - ilOfSet.Emit(OpCodes.Ret); - - //设置属性 - var propertyBuilder = typeBuilder.DefineProperty(propertyName, PropertyAttributes.None, propertyType, null); - propertyBuilder.SetGetMethod(methodGet); - propertyBuilder.SetSetMethod(methodSet); - - foreach (var pinfoAttribute in pinfo.Attributes) - { - //设置特性 - SetPropertyAttribute(ref propertyBuilder, pinfoAttribute); - } - } - } - - private void SetPropertyAttribute(ref PropertyBuilder propertyBuilder, T tAttribute) - { - if (tAttribute == null) return; - - var propertyInfos = tAttribute.GetType().GetProperties().Where(p => p.CanWrite == true).ToArray(); - var constructor = tAttribute.GetType().GetConstructor(new Type[] { }); - var propertyValues = new ArrayList(); - foreach (var propertyInfo in propertyInfos) - propertyValues.Add(propertyInfo.GetValue(tAttribute)); - - var customAttributeBuilder = new CustomAttributeBuilder(constructor, new object[0], propertyInfos, propertyValues.ToArray()); - propertyBuilder.SetCustomAttribute(customAttributeBuilder); - } - - /// - /// Emit动态创建出Class - Type - /// - /// - public Type Build() - { - //初始化AssemblyName的一个实例 - var assemblyName = new AssemblyName("FreeSql.DynamicCompileBuilder"); - //设置程序集的名称 - var defineDynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); - //动态在程序集内创建一个模块 - var defineDynamicModule = - defineDynamicAssembly.DefineDynamicModule("FreeSql.DynamicCompileBuilder.Dynamics"); - //动态的在模块内创建一个类 - var typeBuilder = defineDynamicModule.DefineType(_className, TypeAttributes.Public | TypeAttributes.Class); - - //设置TableAttribute - SetTableAttribute(ref typeBuilder); - - //设置属性 - SetPropertys(ref typeBuilder); - - //创建类的Type对象 - return typeBuilder.CreateType(); - } - - //委托缓存 - private static ConcurrentDictionary - _delegateCache = new ConcurrentDictionary(); - - //设置动态对象的属性值 使用FreeSql自带功能 - public static object CreateObjectByTypeByCodeFirst(IFreeSql fsql, Type type, - Dictionary porpertys) - { - if (type == null) - return null; - object istance = Activator.CreateInstance(type); - if (istance == null) - return null; - var table = fsql.CodeFirst.GetTableByEntity(type); - foreach (var kv in porpertys) - { - table.ColumnsByCs[kv.Key].SetValue(istance, kv.Value); - } - - return istance; - } - - ////设置动态对象的属性值,使用表达式目录树 - //public static object CreateObjectByType(Type type, Dictionary porpertys) - //{ - // if (type == null) - // return null; - // object istance = Activator.CreateInstance(type); - // if (istance == null) - // return null; - // //根据字典中的key确定缓存 - // var cacheKeyStr = string.Join("-", porpertys.Keys.OrderBy(s => s)); - // var cacheKey = Md5Encryption(cacheKeyStr); - // var dynamicDelegate = _delegateCache.GetOrAdd(cacheKey, key => - // { - // //表达式目录树构建委托 - // var typeParam = Expression.Parameter(type); - // var dicParamType = typeof(Dictionary); - // var dicParam = Expression.Parameter(dicParamType); - // var exps = new List(); - // var tempRef = Expression.Variable(typeof(object)); - // foreach (var pinfo in porpertys) - // { - // var propertyInfo = type.GetProperty(pinfo.Key); - // if (propertyInfo == null) - // continue; - // var propertyName = Expression.Constant(pinfo.Key, typeof(string)); - // exps.Add(Expression.Call(dicParam, dicParamType.GetMethod("TryGetValue"), propertyName, tempRef)); - // exps.Add(Expression.Assign(Expression.MakeMemberAccess(typeParam, propertyInfo), - // Expression.Convert(tempRef, propertyInfo.PropertyType))); - // exps.Add(Expression.Assign(tempRef, Expression.Default(typeof(object)))); - // } - - // var returnTarget = Expression.Label(type); - // exps.Add(Expression.Return(returnTarget, typeParam)); - // exps.Add(Expression.Label(returnTarget, Expression.Default(type))); - // var block = Expression.Block(new[] { tempRef }, exps); - // var @delegate = Expression.Lambda(block, typeParam, dicParam).Compile(); - // return @delegate; - // }); - // var dynamicInvoke = dynamicDelegate.DynamicInvoke(istance, porpertys); - // return dynamicInvoke; - //} - - /// - /// 首字母小写 - /// - /// - /// - private string FirstCharToLower(string input) - { - if (string.IsNullOrEmpty(input)) - return input; - string str = input.First().ToString().ToLower() + input.Substring(1); - return str; - } - - /// - /// 首字母大写 - /// - /// - /// - private string FirstCharToUpper(string input) - { - if (string.IsNullOrEmpty(input)) - return input; - string str = input.First().ToString().ToUpper() + input.Substring(1); - return str; - } - - private static string Md5Encryption(string inputStr) - { - var result = string.Empty; - //32位大写 - using (var md5 = MD5.Create()) - { - var resultBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(inputStr)); - result = BitConverter.ToString(resultBytes); - } - - return result; - } - - class DynamicPropertyInfo - { - public string PropertyName { get; set; } = string.Empty; - public Type PropertyType { get; set; } - public Attribute[] Attributes { get; set; } - } - } -#endif -} \ No newline at end of file From 64c9d0bdee84bba3fb5d965f57f7fcd80446b297 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Fri, 5 May 2023 10:52:52 +0800 Subject: [PATCH 24/58] =?UTF-8?q?-=20DynamicEntity=E6=8B=86=E5=88=86?= =?UTF-8?q?=E7=8B=AC=E7=AB=8Bnuget=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index 06db0959..786e1803 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -1301,17 +1301,4 @@ SELECT "); } #endregion - #region DynamicEntity -#if net40 || NETSTANDARD2_0 -#else - /// - /// 动态构建Class Type - /// - /// - public static DynamicCompileBuilder DynamicEntity(this ICodeFirst codeFirst, string className, TableAttribute tableAttribute) - { - return new DynamicCompileBuilder(className, tableAttribute); - } -#endif - #endregion } From b17c2ef4a5bfe6bd44fe8eacd2595212df0f0072 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Fri, 5 May 2023 10:53:28 +0800 Subject: [PATCH 25/58] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0DynamicEntity?= =?UTF-8?q?=E7=AB=8Bnuget=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DynamicCompileBuilder.cs | 231 ++++++++++++++++++ .../DynamicCompileHelper.cs | 74 ++++++ .../FreeSql.Extensions.DynamicEntity.csproj | 15 ++ .../FreeSql.Extensions.DynamicEntity.xml | 81 ++++++ 4 files changed, 401 insertions(+) create mode 100644 Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileBuilder.cs create mode 100644 Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileHelper.cs create mode 100644 Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.csproj create mode 100644 Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.xml diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileBuilder.cs b/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileBuilder.cs new file mode 100644 index 00000000..cbea309a --- /dev/null +++ b/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileBuilder.cs @@ -0,0 +1,231 @@ +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Reflection.Emit; +using System.Security.Cryptography; +using System.Text; + +namespace FreeSql +{ + /// + /// 动态创建实体类型 + /// + public class DynamicCompileBuilder + { + private string _className = string.Empty; + private Attribute[] _tableAttributes = null; + private List _properties = new List(); + private Type _superClass = null; + + /// + /// 配置Class + /// + /// 类名 + /// 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] + /// + public DynamicCompileBuilder Class(string className, params Attribute[] attributes) + { + _className = className; + _tableAttributes = attributes; + return this; + } + + /// + /// 配置属性 + /// + /// 属性名称 + /// 属性类型 + /// 属性标记的特性-支持多个 + /// + public DynamicCompileBuilder Property(string propertyName, Type propertyType, params Attribute[] attributes) + { + _properties.Add(new DynamicPropertyInfo() + { + PropertyName = propertyName, + PropertyType = propertyType, + Attributes = attributes + }); + return this; + } + + /// + /// 配置父类 + /// + /// 父类类型 + /// + public DynamicCompileBuilder SuperClass(Type superClass) + { + _superClass = superClass; + return this; + } + + private void SetTableAttribute(ref TypeBuilder typeBuilder) + { + if (_tableAttributes == null) return; + + foreach (var tableAttribute in _tableAttributes) + { + var propertyValues = new ArrayList(); + + if (tableAttribute == null) continue; + + var classCtorInfo = tableAttribute.GetType().GetConstructor(new Type[] { }); + + var propertyInfos = tableAttribute.GetType().GetProperties().Where(p => p.CanWrite == true).ToArray(); + + foreach (var propertyInfo in propertyInfos) + propertyValues.Add(propertyInfo.GetValue(tableAttribute)); + + //可能存在有参构造 + if (classCtorInfo == null) + { + var constructorTypes = propertyInfos.Select(p => p.PropertyType); + classCtorInfo = tableAttribute.GetType().GetConstructor(constructorTypes.ToArray()); + var customAttributeBuilder = new CustomAttributeBuilder(classCtorInfo, propertyValues.ToArray()); + typeBuilder.SetCustomAttribute(customAttributeBuilder); + } + else + { + var customAttributeBuilder = new CustomAttributeBuilder(classCtorInfo, new object[0], propertyInfos, + propertyValues.ToArray()); + typeBuilder.SetCustomAttribute(customAttributeBuilder); + } + } + } + + private void SetPropertys(ref TypeBuilder typeBuilder) + { + foreach (var pinfo in _properties) + { + if (pinfo == null) + continue; + var propertyName = pinfo.PropertyName; + var propertyType = pinfo.PropertyType; + //设置字段 + var field = typeBuilder.DefineField($"_{FirstCharToLower(propertyName)}", propertyType, + FieldAttributes.Private); + var firstCharToUpper = FirstCharToUpper(propertyName); + //设置属性方法 + var methodGet = typeBuilder.DefineMethod($"Get{firstCharToUpper}", MethodAttributes.Public, + propertyType, null); + var methodSet = typeBuilder.DefineMethod($"Set{firstCharToUpper}", MethodAttributes.Public, null, + new Type[] { propertyType }); + + var ilOfGet = methodGet.GetILGenerator(); + ilOfGet.Emit(OpCodes.Ldarg_0); + ilOfGet.Emit(OpCodes.Ldfld, field); + ilOfGet.Emit(OpCodes.Ret); + + var ilOfSet = methodSet.GetILGenerator(); + ilOfSet.Emit(OpCodes.Ldarg_0); + ilOfSet.Emit(OpCodes.Ldarg_1); + ilOfSet.Emit(OpCodes.Stfld, field); + ilOfSet.Emit(OpCodes.Ret); + + //设置属性 + var propertyBuilder = + typeBuilder.DefineProperty(propertyName, PropertyAttributes.None, propertyType, null); + propertyBuilder.SetGetMethod(methodGet); + propertyBuilder.SetSetMethod(methodSet); + + foreach (var pinfoAttribute in pinfo.Attributes) + { + //设置特性 + SetPropertyAttribute(ref propertyBuilder, pinfoAttribute); + } + } + } + + private void SetPropertyAttribute(ref PropertyBuilder propertyBuilder, T tAttribute) + { + if (tAttribute == null) return; + + var propertyInfos = tAttribute.GetType().GetProperties().Where(p => p.CanWrite == true).ToArray(); + var constructor = tAttribute.GetType().GetConstructor(new Type[] { }); + var propertyValues = new ArrayList(); + foreach (var propertyInfo in propertyInfos) + propertyValues.Add(propertyInfo.GetValue(tAttribute)); + + var customAttributeBuilder = + new CustomAttributeBuilder(constructor, new object[0], propertyInfos, propertyValues.ToArray()); + propertyBuilder.SetCustomAttribute(customAttributeBuilder); + } + + /// + /// Emit动态创建出Class - Type + /// + /// + public Type Build() + { + //初始化AssemblyName的一个实例 + var assemblyName = new AssemblyName("FreeSql.DynamicCompileBuilder"); + //设置程序集的名称 + var defineDynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); + //动态在程序集内创建一个模块 + var defineDynamicModule = + defineDynamicAssembly.DefineDynamicModule("FreeSql.DynamicCompileBuilder.Dynamics"); + //动态的在模块内创建一个类 + var typeBuilder = + defineDynamicModule.DefineType(_className, TypeAttributes.Public | TypeAttributes.Class, _superClass); + + //设置TableAttribute + SetTableAttribute(ref typeBuilder); + + //设置属性 + SetPropertys(ref typeBuilder); + + //创建类的Type对象 + return typeBuilder.CreateType(); + } + + /// + /// 首字母小写 + /// + /// + /// + private string FirstCharToLower(string input) + { + if (string.IsNullOrEmpty(input)) + return input; + string str = input.First().ToString().ToLower() + input.Substring(1); + return str; + } + + /// + /// 首字母大写 + /// + /// + /// + private string FirstCharToUpper(string input) + { + if (string.IsNullOrEmpty(input)) + return input; + string str = input.First().ToString().ToUpper() + input.Substring(1); + return str; + } + + private static string Md5Encryption(string inputStr) + { + var result = string.Empty; + //32位大写 + using (var md5 = MD5.Create()) + { + var resultBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(inputStr)); + result = BitConverter.ToString(resultBytes); + } + + return result; + } + + class DynamicPropertyInfo + { + public string PropertyName { get; set; } = string.Empty; + public Type PropertyType { get; set; } + public Attribute[] Attributes { get; set; } + } + } +} \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileHelper.cs b/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileHelper.cs new file mode 100644 index 00000000..5e839e06 --- /dev/null +++ b/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileHelper.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq.Expressions; + +namespace FreeSql.Extensions.DynamicEntity +{ + /// + /// 动态创建对象帮助类 + /// + public class DynamicCompileHelper + { + /// + /// 动态构建Class - Type + /// + /// + public static DynamicCompileBuilder DynamicBuilder() + { + return new DynamicCompileBuilder(); + } + + /// + /// 委托缓存 + /// + private static readonly ConcurrentDictionary + DelegateCache = new ConcurrentDictionary(); + + /// + /// 设置动态对象的属性值 + /// + /// + /// + /// + public static object CreateObjectByType(Type type, Dictionary porpertys) + { + if (type == null) + return null; + object istance = Activator.CreateInstance(type); + if (istance == null) + return null; + //根据key确定缓存 + var cacheKey = $"{type.GetHashCode()}{porpertys.GetHashCode()}"; + var dynamicDelegate = DelegateCache.GetOrAdd(cacheKey, key => + { + //表达式目录树构建委托 + var typeParam = Expression.Parameter(type); + var dicParamType = typeof(Dictionary); + var dicParam = Expression.Parameter(dicParamType); + var exps = new List(); + var tempRef = Expression.Variable(typeof(object)); + foreach (var pinfo in porpertys) + { + var propertyInfo = type.GetProperty(pinfo.Key); + if (propertyInfo == null) + continue; + var propertyName = Expression.Constant(pinfo.Key, typeof(string)); + exps.Add(Expression.Call(dicParam, dicParamType.GetMethod("TryGetValue"), propertyName, tempRef)); + exps.Add(Expression.Assign(Expression.MakeMemberAccess(typeParam, propertyInfo), + Expression.Convert(tempRef, propertyInfo.PropertyType))); + exps.Add(Expression.Assign(tempRef, Expression.Default(typeof(object)))); + } + + var returnTarget = Expression.Label(type); + exps.Add(Expression.Return(returnTarget, typeParam)); + exps.Add(Expression.Label(returnTarget, Expression.Default(type))); + var block = Expression.Block(new[] { tempRef }, exps); + var @delegate = Expression.Lambda(block, typeParam, dicParam).Compile(); + return @delegate; + }); + var dynamicInvoke = dynamicDelegate.DynamicInvoke(istance, porpertys); + return dynamicInvoke; + } + } +} \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.csproj b/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.csproj new file mode 100644 index 00000000..c1b359b8 --- /dev/null +++ b/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.csproj @@ -0,0 +1,15 @@ + + + + netstandard2.1;net451;net45; + True + FreeSql.Extensions.DynamicEntity.xml + + + + + Always + + + + diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.xml b/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.xml new file mode 100644 index 00000000..b5032f3a --- /dev/null +++ b/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.xml @@ -0,0 +1,81 @@ + + + + FreeSql.Extensions.DynamicEntity + + + + + 动态创建实体类型 + + + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性-支持多个 + + + + + 配置父类 + + 父类类型 + + + + + Emit动态创建出Class - Type + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + + + + 动态创建对象帮助类 + + + + + 动态构建Class - Type + + + + + + 委托缓存 + + + + + 设置动态对象的属性值 + + + + + + + From 785d204a2ce3df1a5d9c532059c11247a6c9bf52 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Fri, 5 May 2023 10:59:05 +0800 Subject: [PATCH 26/58] =?UTF-8?q?-=20FreeSql.Extensions.DynamicEntity?= =?UTF-8?q?=E5=8C=85=E4=BF=A1=E6=81=AF=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FreeSql.Extensions.DynamicEntity.csproj | 49 ++++++++++++++---- .../FreeSql.Extensions.DynamicEntity/key.snk | Bin 0 -> 596 bytes 2 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 Extensions/FreeSql.Extensions.DynamicEntity/key.snk diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.csproj b/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.csproj index c1b359b8..321f8a2d 100644 --- a/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.csproj +++ b/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.csproj @@ -1,15 +1,42 @@  - - netstandard2.1;net451;net45; - True - FreeSql.Extensions.DynamicEntity.xml - + + netstandard2.1;net451;net45; + True + true + FreeSql;ncc;YeXiangQin;Daily + FreeSql 扩展包,可实现动态构建实体类,动态创建表. + https://github.com/2881099/FreeSql + https://github.com/2881099/FreeSql + git + MIT + FreeSql;ORM + $(AssemblyName) + logo.png + $(AssemblyName) + true + true + true + key.snk + false + 3.2.694 $(AssemblyName) + logo.png + $(AssemblyName) + true + true + true + key.snk + false + FreeSql.Extensions.DynamicEntity.xml + + + + - - - Always - - + + + Always + + - + \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/key.snk b/Extensions/FreeSql.Extensions.DynamicEntity/key.snk new file mode 100644 index 0000000000000000000000000000000000000000..e580bc8d5d64e7c5a0c62b971545d38cfbe7d837 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096c(W3|+clf|4d2=6Xc+R`Gd@9@k@Meh} zR8`}1=JPk=q?Zlr?i$1O?SgX-{{&z z|LRF?-aWODhAO}h_7M!wz}uPXx}n-g{((r9{{%_ z4)%gVXcj;Ru@GYAIZI@e#GBtO#O5m-Qr4X_lbAV}=qNRkd0^`@I6i9k`wSe@ZPxVo zk;MXig(S-cYHE!0GWWlp7EH@E!WkF6jS+3z4rvW0%Sq;U1bq`B9*HNJjxo*23*7Vw zHyt>{2CR~8==`lYLgAmwsXPXYZ_AEAKy|PuUz0(G)L1xO{{*n6Bn?mV~QKg!055THihpc>GOh(U-NgO?4_DzY4uq!p9=Q;`G i9;v3GkC674Mbx4_b$)?7a0%Z%&zUjzbGs@!l^s|B literal 0 HcmV?d00001 From 52ce785002ab2f211f62f9ba545da04ab0d73b3e Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Fri, 5 May 2023 11:03:42 +0800 Subject: [PATCH 27/58] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0DynamicEntity?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs diff --git a/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs b/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs new file mode 100644 index 00000000..9e71b207 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FreeSql.Tests.DynamicEntity +{ + internal class DynamicEntityTest + { + } +} From 6b86fc46bd6926e605de0abf8a8fc1388e9786dd Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Fri, 5 May 2023 11:06:41 +0800 Subject: [PATCH 28/58] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0DynamicEntity=20-?= =?UTF-8?q?=20Attribute=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DynamicEntity/DynamicEntityTest.cs | 56 ++++++++++++++++++- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs b/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs index 9e71b207..8b80a2fc 100644 --- a/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs @@ -3,10 +3,62 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using FreeSql.DataAnnotations; +using FreeSql.Extensions.DynamicEntity; +using Xunit; namespace FreeSql.Tests.DynamicEntity { - internal class DynamicEntityTest + public class DynamicEntityTest { + private static IFreeSql fsql = new FreeSqlBuilder().UseConnectionString(DataType.PostgreSQL, + "Host=192.168.0.36;Port=5432;Username=postgres;Password=123; Database=test;ArrayNullabilityMode=Always;Pooling=true;Minimum Pool Size=1") + .UseMonitorCommand(d => Console.WriteLine(d.CommandText)).Build(); + + + [Fact] + public void NormalTest() + { + Type type = DynamicCompileHelper.DynamicBuilder() + .Class("NormalUsers") + .Property("Id", typeof(int)) + .Property("Name", typeof(string)) + .Property("Address", typeof(string)) + .Build(); + var dict = new Dictionary + { + ["Name"] = "张三", + ["Id"] = 1, + ["Address"] = "北京市" + }; + var instance = DynamicCompileHelper.CreateObjectByType(type, dict); + //根据Type生成表 + fsql.CodeFirst.SyncStructure(type); + fsql.Insert().AsType(type).AppendData(instance).ExecuteAffrows(); + } + + [Fact] + public void AttributeTest() + { + Type type = DynamicCompileHelper.DynamicBuilder() + .Class("AttributeUsers", new TableAttribute() { Name = "T_Attribute_User" }, + new IndexAttribute("Name_Index", "Name", false)) + .Property("Id", typeof(int), + new ColumnAttribute() { IsPrimary = true, IsIdentity = true, Position = 1 }) + .Property("Name", typeof(string), + new ColumnAttribute() { StringLength = 20, Position = 2 }) + .Property("Address", typeof(string), + new ColumnAttribute() { StringLength = 150, Position = 3 }) + .Build(); + var dict = new Dictionary + { + ["Name"] = "张三", + ["Address"] = "北京市" + }; + var instance = DynamicCompileHelper.CreateObjectByType(type, dict); + //根据Type生成表 + fsql.CodeFirst.SyncStructure(type); + fsql.Insert().AsType(type).AppendData(instance).ExecuteAffrows(); + } } -} +} \ No newline at end of file From 4e36d6ca204921c3eb28908f0c20b111b9a74c55 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Fri, 5 May 2023 11:19:09 +0800 Subject: [PATCH 29/58] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0DynamicEntity=20-?= =?UTF-8?q?=20SuperClass=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DynamicEntity/DynamicEntityTest.cs | 43 ++++++++++++++++++- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs b/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs index 8b80a2fc..c3638f85 100644 --- a/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs @@ -21,14 +21,14 @@ namespace FreeSql.Tests.DynamicEntity { Type type = DynamicCompileHelper.DynamicBuilder() .Class("NormalUsers") - .Property("Id", typeof(int)) + .Property("Id", typeof(string)) .Property("Name", typeof(string)) .Property("Address", typeof(string)) .Build(); var dict = new Dictionary { ["Name"] = "张三", - ["Id"] = 1, + ["Id"] = Guid.NewGuid().ToString(), ["Address"] = "北京市" }; var instance = DynamicCompileHelper.CreateObjectByType(type, dict); @@ -58,7 +58,46 @@ namespace FreeSql.Tests.DynamicEntity var instance = DynamicCompileHelper.CreateObjectByType(type, dict); //根据Type生成表 fsql.CodeFirst.SyncStructure(type); + var insertId = fsql.Insert().AsType(type).AppendData(instance).ExecuteIdentity(); + var select = fsql.Select().AsType(type).ToList(); + } + + [Fact] + public void SuperClassTest() + { + Type type = DynamicCompileHelper.DynamicBuilder() + .Class("Roles", new TableAttribute() { Name = "T_Role" }, + new IndexAttribute("Name_Index", "Name", false)) + .SuperClass(typeof(BaseModel)) + .Property("Id", typeof(int), + new ColumnAttribute() { IsPrimary = true, IsIdentity = true, Position = 1 }) + .Property("Name", typeof(string), + new ColumnAttribute() { StringLength = 20, Position = 2 }) + .Build(); + var dict = new Dictionary + { + ["Name"] = "系统管理员", + ["UpdateTime"] = DateTime.Now, + ["UpdatePerson"] = "admin" + }; + var instance = DynamicCompileHelper.CreateObjectByType(type, dict); + //根据Type生成表 + fsql.CodeFirst.SyncStructure(type); fsql.Insert().AsType(type).AppendData(instance).ExecuteAffrows(); } } + public class BaseModel + { + [Column(Position = 99)] + public DateTime UpdateTime + { + get; set; + } + + [Column(Position = 100, StringLength = 20)] + public string UpdatePerson + { + get; set; + } + } } \ No newline at end of file From fa20468dc8dbf032ea407528faea6662c12c68e5 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Fri, 5 May 2023 11:19:56 +0800 Subject: [PATCH 30/58] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0DynamicEntity?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj index 79602ff3..d9745794 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj @@ -35,6 +35,7 @@ + From 18cd0e7a281cffbaee1102872a25403c7602f821 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Fri, 5 May 2023 11:44:12 +0800 Subject: [PATCH 31/58] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96DynamicEntity?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=8A=A8=E6=80=81=E5=AF=B9=E8=B1=A1=E7=9A=84?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E5=80=BC=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DynamicCompileBuilder.cs | 6 ++--- .../DynamicCompileHelper.cs | 24 ++++++++++++++++--- .../FreeSql.Extensions.DynamicEntity.xml | 14 +++++------ 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileBuilder.cs b/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileBuilder.cs index cbea309a..be1bbf0e 100644 --- a/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileBuilder.cs +++ b/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileBuilder.cs @@ -1,15 +1,13 @@ using System; using System.Collections; -using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; -using System.Linq.Expressions; using System.Reflection; using System.Reflection.Emit; using System.Security.Cryptography; using System.Text; -namespace FreeSql +namespace FreeSql.Extensions.DynamicEntity { /// /// 动态创建实体类型 @@ -57,7 +55,7 @@ namespace FreeSql /// /// 父类类型 /// - public DynamicCompileBuilder SuperClass(Type superClass) + public DynamicCompileBuilder Extend(Type superClass) { _superClass = superClass; return this; diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileHelper.cs b/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileHelper.cs index 5e839e06..dec44591 100644 --- a/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileHelper.cs +++ b/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileHelper.cs @@ -1,7 +1,10 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Linq; using System.Linq.Expressions; +using System.Security.Cryptography; +using System.Text; namespace FreeSql.Extensions.DynamicEntity { @@ -22,8 +25,8 @@ namespace FreeSql.Extensions.DynamicEntity /// /// 委托缓存 /// - private static readonly ConcurrentDictionary - DelegateCache = new ConcurrentDictionary(); + private static readonly ConcurrentDictionary DelegateCache = + new ConcurrentDictionary(); /// /// 设置动态对象的属性值 @@ -39,7 +42,9 @@ namespace FreeSql.Extensions.DynamicEntity if (istance == null) return null; //根据key确定缓存 - var cacheKey = $"{type.GetHashCode()}{porpertys.GetHashCode()}"; + var cacheKeyStr = string.Join("-", porpertys.Keys.OrderBy(s => s)); + var dicKey = Md5Encryption(cacheKeyStr); + var cacheKey = $"{type.GetHashCode()}-{dicKey}"; var dynamicDelegate = DelegateCache.GetOrAdd(cacheKey, key => { //表达式目录树构建委托 @@ -70,5 +75,18 @@ namespace FreeSql.Extensions.DynamicEntity var dynamicInvoke = dynamicDelegate.DynamicInvoke(istance, porpertys); return dynamicInvoke; } + + private static string Md5Encryption(string inputStr) + { + var result = string.Empty; + //32位大写 + using (var md5 = MD5.Create()) + { + var resultBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(inputStr)); + result = BitConverter.ToString(resultBytes); + } + + return result; + } } } \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.xml b/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.xml index b5032f3a..a2ae1e55 100644 --- a/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.xml +++ b/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.xml @@ -4,12 +4,12 @@ FreeSql.Extensions.DynamicEntity - + 动态创建实体类型 - + 配置Class @@ -17,7 +17,7 @@ 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] - + 配置属性 @@ -26,27 +26,27 @@ 属性标记的特性-支持多个 - + 配置父类 父类类型 - + Emit动态创建出Class - Type - + 首字母小写 - + 首字母大写 From c761e45b922ce70263e350023781f67880ac7e23 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Fri, 5 May 2023 11:46:48 +0800 Subject: [PATCH 32/58] =?UTF-8?q?-=20DynamicEntity=E6=8B=86=E5=88=86?= =?UTF-8?q?=E7=8B=AC=E7=AB=8Bnuget=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.sln | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/FreeSql.sln b/FreeSql.sln index e20ed226..4dd2b5f1 100644 --- a/FreeSql.sln +++ b/FreeSql.sln @@ -125,6 +125,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.Xugu", "Pr EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.Provider.Xugu", "FreeSql.Tests\FreeSql.Tests.Provider.Xugu\FreeSql.Tests.Provider.Xugu.csproj", "{16C21D77-20AC-4722-AD97-F53BDDE8210C}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.DynamicEntity", "Extensions\FreeSql.Extensions.DynamicEntity\FreeSql.Extensions.DynamicEntity.csproj", "{FC4639EC-7787-4F85-AC02-26875E39E573}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -747,6 +749,18 @@ Global {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Release|x64.Build.0 = Release|Any CPU {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Release|x86.ActiveCfg = Release|Any CPU {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Release|x86.Build.0 = Release|Any CPU + {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|x64.ActiveCfg = Debug|Any CPU + {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|x64.Build.0 = Debug|Any CPU + {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|x86.ActiveCfg = Debug|Any CPU + {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|x86.Build.0 = Debug|Any CPU + {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|Any CPU.Build.0 = Release|Any CPU + {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|x64.ActiveCfg = Release|Any CPU + {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|x64.Build.0 = Release|Any CPU + {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|x86.ActiveCfg = Release|Any CPU + {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -787,6 +801,7 @@ Global {8A06B18A-A8BF-4AEA-AFE4-0F573C2DBFEE} = {2A381C57-2697-427B-9F10-55DA11FD02E4} {71A6F937-D11B-4AE4-9933-BB6B4D925665} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA} {8064870C-22EA-4A58-972D-DBD57D096D91} = {2A381C57-2697-427B-9F10-55DA11FD02E4} + {FC4639EC-7787-4F85-AC02-26875E39E573} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution RESX_NeutralResourcesLanguage = en-US From d26ad21833f41dd21781a0dd11a16c219b0222c5 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Fri, 5 May 2023 11:52:18 +0800 Subject: [PATCH 33/58] =?UTF-8?q?-=20=E8=B0=83=E6=95=B4DynamicEntity?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DynamicEntity/DynamicEntityTest.cs | 3 +- FreeSql/FreeSql.xml | 43 ------------------- 2 files changed, 1 insertion(+), 45 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs b/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs index c3638f85..77579f8c 100644 --- a/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs @@ -15,7 +15,6 @@ namespace FreeSql.Tests.DynamicEntity "Host=192.168.0.36;Port=5432;Username=postgres;Password=123; Database=test;ArrayNullabilityMode=Always;Pooling=true;Minimum Pool Size=1") .UseMonitorCommand(d => Console.WriteLine(d.CommandText)).Build(); - [Fact] public void NormalTest() { @@ -68,7 +67,7 @@ namespace FreeSql.Tests.DynamicEntity Type type = DynamicCompileHelper.DynamicBuilder() .Class("Roles", new TableAttribute() { Name = "T_Role" }, new IndexAttribute("Name_Index", "Name", false)) - .SuperClass(typeof(BaseModel)) + .Extend(typeof(BaseModel)) .Property("Id", typeof(int), new ColumnAttribute() { IsPrimary = true, IsIdentity = true, Position = 1 }) .Property("Name", typeof(string), diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 1eab8ccc..5323d7da 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -4248,43 +4248,6 @@ Dict:key=属性名,value=注释 - - - 配置Class - - 类名 - 类标记的特性[Table(Name = "xxx")] - - - - - 配置属性 - - 属性名称 - 属性类型 - 属性标记的特性-支持多个 - - - - - Emit动态创建出Class - Type - - - - - - 首字母小写 - - - - - - - 首字母大写 - - - - 更新实体的元数据 @@ -5906,12 +5869,6 @@ - - - 动态构建Class Type - - - 使用 and 拼接两个 lambda 表达式 From fb7eb01a2bbff9e3db5f8479bec85a82825e169e Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 5 May 2023 17:01:52 +0800 Subject: [PATCH 34/58] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20OracleOledb=20?= =?UTF-8?q?=E5=BC=95=E8=B5=B7=E7=9A=84=E8=AF=BB=E5=8F=96=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B=20-=20=E8=B0=83=E6=95=B4=20DynamicE?= =?UTF-8?q?ntity=20API=EF=BC=9B#1505?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DynamicCompileHelper.cs | 92 --------- .../FreeSql.Extensions.DynamicEntity.csproj | 42 ---- .../FreeSql.Extensions.DynamicEntity.xml | 81 -------- .../FreeSql.Extensions.DynamicEntity/key.snk | Bin 596 -> 0 bytes FreeSql.DbContext/FreeSql.DbContext.xml | 9 + .../DynamicEntity/DynamicEntityTest.cs | 37 ++-- .../FreeSql.Tests/FreeSql.Tests.csproj | 1 - FreeSql.sln | 15 -- .../Extensions/DynamicEntityExtensions.cs | 69 ++++++- FreeSql/FreeSql.xml | 183 ------------------ .../SelectProvider/Select0Provider.cs | 1 + .../SelectProvider/Select0ProviderReader.cs | 5 +- .../FreeSql.Provider.MySql/MySqlProvider.cs | 7 +- .../FreeSql.Provider.Oracle/OracleProvider.cs | 17 +- 14 files changed, 109 insertions(+), 450 deletions(-) delete mode 100644 Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileHelper.cs delete mode 100644 Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.csproj delete mode 100644 Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.xml delete mode 100644 Extensions/FreeSql.Extensions.DynamicEntity/key.snk rename Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileBuilder.cs => FreeSql/Extensions/DynamicEntityExtensions.cs (79%) diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileHelper.cs b/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileHelper.cs deleted file mode 100644 index dec44591..00000000 --- a/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileHelper.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Security.Cryptography; -using System.Text; - -namespace FreeSql.Extensions.DynamicEntity -{ - /// - /// 动态创建对象帮助类 - /// - public class DynamicCompileHelper - { - /// - /// 动态构建Class - Type - /// - /// - public static DynamicCompileBuilder DynamicBuilder() - { - return new DynamicCompileBuilder(); - } - - /// - /// 委托缓存 - /// - private static readonly ConcurrentDictionary DelegateCache = - new ConcurrentDictionary(); - - /// - /// 设置动态对象的属性值 - /// - /// - /// - /// - public static object CreateObjectByType(Type type, Dictionary porpertys) - { - if (type == null) - return null; - object istance = Activator.CreateInstance(type); - if (istance == null) - return null; - //根据key确定缓存 - var cacheKeyStr = string.Join("-", porpertys.Keys.OrderBy(s => s)); - var dicKey = Md5Encryption(cacheKeyStr); - var cacheKey = $"{type.GetHashCode()}-{dicKey}"; - var dynamicDelegate = DelegateCache.GetOrAdd(cacheKey, key => - { - //表达式目录树构建委托 - var typeParam = Expression.Parameter(type); - var dicParamType = typeof(Dictionary); - var dicParam = Expression.Parameter(dicParamType); - var exps = new List(); - var tempRef = Expression.Variable(typeof(object)); - foreach (var pinfo in porpertys) - { - var propertyInfo = type.GetProperty(pinfo.Key); - if (propertyInfo == null) - continue; - var propertyName = Expression.Constant(pinfo.Key, typeof(string)); - exps.Add(Expression.Call(dicParam, dicParamType.GetMethod("TryGetValue"), propertyName, tempRef)); - exps.Add(Expression.Assign(Expression.MakeMemberAccess(typeParam, propertyInfo), - Expression.Convert(tempRef, propertyInfo.PropertyType))); - exps.Add(Expression.Assign(tempRef, Expression.Default(typeof(object)))); - } - - var returnTarget = Expression.Label(type); - exps.Add(Expression.Return(returnTarget, typeParam)); - exps.Add(Expression.Label(returnTarget, Expression.Default(type))); - var block = Expression.Block(new[] { tempRef }, exps); - var @delegate = Expression.Lambda(block, typeParam, dicParam).Compile(); - return @delegate; - }); - var dynamicInvoke = dynamicDelegate.DynamicInvoke(istance, porpertys); - return dynamicInvoke; - } - - private static string Md5Encryption(string inputStr) - { - var result = string.Empty; - //32位大写 - using (var md5 = MD5.Create()) - { - var resultBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(inputStr)); - result = BitConverter.ToString(resultBytes); - } - - return result; - } - } -} \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.csproj b/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.csproj deleted file mode 100644 index 321f8a2d..00000000 --- a/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.csproj +++ /dev/null @@ -1,42 +0,0 @@ - - - - netstandard2.1;net451;net45; - True - true - FreeSql;ncc;YeXiangQin;Daily - FreeSql 扩展包,可实现动态构建实体类,动态创建表. - https://github.com/2881099/FreeSql - https://github.com/2881099/FreeSql - git - MIT - FreeSql;ORM - $(AssemblyName) - logo.png - $(AssemblyName) - true - true - true - key.snk - false - 3.2.694 $(AssemblyName) - logo.png - $(AssemblyName) - true - true - true - key.snk - false - FreeSql.Extensions.DynamicEntity.xml - - - - - - - - Always - - - - \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.xml b/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.xml deleted file mode 100644 index a2ae1e55..00000000 --- a/Extensions/FreeSql.Extensions.DynamicEntity/FreeSql.Extensions.DynamicEntity.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - FreeSql.Extensions.DynamicEntity - - - - - 动态创建实体类型 - - - - - 配置Class - - 类名 - 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] - - - - - 配置属性 - - 属性名称 - 属性类型 - 属性标记的特性-支持多个 - - - - - 配置父类 - - 父类类型 - - - - - Emit动态创建出Class - Type - - - - - - 首字母小写 - - - - - - - 首字母大写 - - - - - - - 动态创建对象帮助类 - - - - - 动态构建Class - Type - - - - - - 委托缓存 - - - - - 设置动态对象的属性值 - - - - - - - diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/key.snk b/Extensions/FreeSql.Extensions.DynamicEntity/key.snk deleted file mode 100644 index e580bc8d5d64e7c5a0c62b971545d38cfbe7d837..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096c(W3|+clf|4d2=6Xc+R`Gd@9@k@Meh} zR8`}1=JPk=q?Zlr?i$1O?SgX-{{&z z|LRF?-aWODhAO}h_7M!wz}uPXx}n-g{((r9{{%_ z4)%gVXcj;Ru@GYAIZI@e#GBtO#O5m-Qr4X_lbAV}=qNRkd0^`@I6i9k`wSe@ZPxVo zk;MXig(S-cYHE!0GWWlp7EH@E!WkF6jS+3z4rvW0%Sq;U1bq`B9*HNJjxo*23*7Vw zHyt>{2CR~8==`lYLgAmwsXPXYZ_AEAKy|PuUz0(G)L1xO{{*n6Bn?mV~QKg!055THihpc>GOh(U-NgO?4_DzY4uq!p9=Q;`G i9;v3GkC674Mbx4_b$)?7a0%Z%&zUjzbGs@!l^s|B 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/DynamicEntity/DynamicEntityTest.cs b/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs index 77579f8c..c1385540 100644 --- a/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs @@ -11,15 +11,14 @@ namespace FreeSql.Tests.DynamicEntity { public class DynamicEntityTest { - private static IFreeSql fsql = new FreeSqlBuilder().UseConnectionString(DataType.PostgreSQL, - "Host=192.168.0.36;Port=5432;Username=postgres;Password=123; Database=test;ArrayNullabilityMode=Always;Pooling=true;Minimum Pool Size=1") + private static IFreeSql fsql = new FreeSqlBuilder().UseConnectionString(DataType.Sqlite, + "data source=:memory:") .UseMonitorCommand(d => Console.WriteLine(d.CommandText)).Build(); [Fact] public void NormalTest() { - Type type = DynamicCompileHelper.DynamicBuilder() - .Class("NormalUsers") + var table = fsql.CodeFirst.DynamicEntity("NormalUsers") .Property("Id", typeof(string)) .Property("Name", typeof(string)) .Property("Address", typeof(string)) @@ -30,18 +29,17 @@ namespace FreeSql.Tests.DynamicEntity ["Id"] = Guid.NewGuid().ToString(), ["Address"] = "北京市" }; - var instance = DynamicCompileHelper.CreateObjectByType(type, dict); + var instance = table.CreateInstance(dict); //根据Type生成表 - fsql.CodeFirst.SyncStructure(type); - fsql.Insert().AsType(type).AppendData(instance).ExecuteAffrows(); + fsql.CodeFirst.SyncStructure(table.Type); + fsql.Insert().AsType(table.Type).AppendData(instance).ExecuteAffrows(); } [Fact] public void AttributeTest() { - Type type = DynamicCompileHelper.DynamicBuilder() - .Class("AttributeUsers", new TableAttribute() { Name = "T_Attribute_User" }, - new IndexAttribute("Name_Index", "Name", false)) + var table = fsql.CodeFirst.DynamicEntity("AttributeUsers", new TableAttribute() { Name = "T_Attribute_User" }, + new IndexAttribute("Name_Index1", "Name", false)) .Property("Id", typeof(int), new ColumnAttribute() { IsPrimary = true, IsIdentity = true, Position = 1 }) .Property("Name", typeof(string), @@ -54,19 +52,18 @@ namespace FreeSql.Tests.DynamicEntity ["Name"] = "张三", ["Address"] = "北京市" }; - var instance = DynamicCompileHelper.CreateObjectByType(type, dict); + var instance = table.CreateInstance(dict); //根据Type生成表 - fsql.CodeFirst.SyncStructure(type); - var insertId = fsql.Insert().AsType(type).AppendData(instance).ExecuteIdentity(); - var select = fsql.Select().AsType(type).ToList(); + fsql.CodeFirst.SyncStructure(table.Type); + var insertId = fsql.Insert().AsType(table.Type).AppendData(instance).ExecuteIdentity(); + var select = fsql.Select().AsType(table.Type).ToList(); } [Fact] public void SuperClassTest() { - Type type = DynamicCompileHelper.DynamicBuilder() - .Class("Roles", new TableAttribute() { Name = "T_Role" }, - new IndexAttribute("Name_Index", "Name", false)) + var table = fsql.CodeFirst.DynamicEntity("Roles", new TableAttribute() { Name = "T_Role" }, + new IndexAttribute("Name_Index2", "Name", false)) .Extend(typeof(BaseModel)) .Property("Id", typeof(int), new ColumnAttribute() { IsPrimary = true, IsIdentity = true, Position = 1 }) @@ -79,10 +76,10 @@ namespace FreeSql.Tests.DynamicEntity ["UpdateTime"] = DateTime.Now, ["UpdatePerson"] = "admin" }; - var instance = DynamicCompileHelper.CreateObjectByType(type, dict); + var instance = table.CreateInstance(dict); //根据Type生成表 - fsql.CodeFirst.SyncStructure(type); - fsql.Insert().AsType(type).AppendData(instance).ExecuteAffrows(); + fsql.CodeFirst.SyncStructure(table.Type); + fsql.Insert().AsType(table.Type).AppendData(instance).ExecuteAffrows(); } } public class BaseModel diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj index d9745794..79602ff3 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj @@ -35,7 +35,6 @@ - diff --git a/FreeSql.sln b/FreeSql.sln index 4dd2b5f1..e20ed226 100644 --- a/FreeSql.sln +++ b/FreeSql.sln @@ -125,8 +125,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.Xugu", "Pr EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.Provider.Xugu", "FreeSql.Tests\FreeSql.Tests.Provider.Xugu\FreeSql.Tests.Provider.Xugu.csproj", "{16C21D77-20AC-4722-AD97-F53BDDE8210C}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.DynamicEntity", "Extensions\FreeSql.Extensions.DynamicEntity\FreeSql.Extensions.DynamicEntity.csproj", "{FC4639EC-7787-4F85-AC02-26875E39E573}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -749,18 +747,6 @@ Global {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Release|x64.Build.0 = Release|Any CPU {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Release|x86.ActiveCfg = Release|Any CPU {16C21D77-20AC-4722-AD97-F53BDDE8210C}.Release|x86.Build.0 = Release|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|x64.ActiveCfg = Debug|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|x64.Build.0 = Debug|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|x86.ActiveCfg = Debug|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Debug|x86.Build.0 = Debug|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|Any CPU.Build.0 = Release|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|x64.ActiveCfg = Release|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|x64.Build.0 = Release|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|x86.ActiveCfg = Release|Any CPU - {FC4639EC-7787-4F85-AC02-26875E39E573}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -801,7 +787,6 @@ Global {8A06B18A-A8BF-4AEA-AFE4-0F573C2DBFEE} = {2A381C57-2697-427B-9F10-55DA11FD02E4} {71A6F937-D11B-4AE4-9933-BB6B4D925665} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA} {8064870C-22EA-4A58-972D-DBD57D096D91} = {2A381C57-2697-427B-9F10-55DA11FD02E4} - {FC4639EC-7787-4F85-AC02-26875E39E573} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution RESX_NeutralResourcesLanguage = en-US diff --git a/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileBuilder.cs b/FreeSql/Extensions/DynamicEntityExtensions.cs similarity index 79% rename from Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileBuilder.cs rename to FreeSql/Extensions/DynamicEntityExtensions.cs index be1bbf0e..f4659e1e 100644 --- a/Extensions/FreeSql.Extensions.DynamicEntity/DynamicCompileBuilder.cs +++ b/FreeSql/Extensions/DynamicEntityExtensions.cs @@ -1,4 +1,14 @@ -using System; +// by: Daily + +#if net40 || NETSTANDARD2_0 +# else + +using FreeSql; +using FreeSql.DataAnnotations; +using FreeSql.Extensions.DynamicEntity; +using FreeSql.Internal.CommonProvider; +using FreeSql.Internal.Model; +using System; using System.Collections; using System.Collections.Generic; using System.Linq; @@ -7,6 +17,50 @@ using System.Reflection.Emit; using System.Security.Cryptography; using System.Text; +public static class FreeSqlGlobalDynamicEntityExtensions +{ + /// + /// 动态构建Class Type + /// + /// + public static DynamicCompileBuilder DynamicEntity(this ICodeFirst codeFirst, string className, params Attribute[] attributes) + { + return new DynamicCompileBuilder((codeFirst as CodeFirstProvider)._orm, className, attributes); + } + + /// + /// 根据字典,创建 table 对应的实体对象 + /// + /// + /// + /// + public static object CreateInstance(this TableInfo table, Dictionary dict) + { + if (table == null || dict == null) return null; + var instance = table.Type.CreateInstanceGetDefaultValue(); + foreach (var key in table.ColumnsByCs.Keys) + { + if (dict.ContainsKey(key) == false) continue; + table.ColumnsByCs[key].SetValue(instance, dict[key]); + } + return instance; + } + /// + /// 根据实体对象,创建 table 对应的字典 + /// + /// + /// + /// + public static Dictionary CreateDictionary(this TableInfo table, object instance) + { + if (table == null || instance == null) return null; + var dict = new Dictionary(); + foreach (var key in table.ColumnsByCs.Keys) + dict[key] = table.ColumnsByCs[key].GetValue(instance); + return dict; + } +} + namespace FreeSql.Extensions.DynamicEntity { /// @@ -18,6 +72,7 @@ namespace FreeSql.Extensions.DynamicEntity private Attribute[] _tableAttributes = null; private List _properties = new List(); private Type _superClass = null; + private IFreeSql _fsql = null; /// /// 配置Class @@ -25,11 +80,11 @@ namespace FreeSql.Extensions.DynamicEntity /// 类名 /// 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] /// - public DynamicCompileBuilder Class(string className, params Attribute[] attributes) + public DynamicCompileBuilder(IFreeSql fsql, string className, params Attribute[] attributes) { + _fsql = fsql; _className = className; _tableAttributes = attributes; - return this; } /// @@ -157,7 +212,7 @@ namespace FreeSql.Extensions.DynamicEntity /// Emit动态创建出Class - Type /// /// - public Type Build() + public TableInfo Build() { //初始化AssemblyName的一个实例 var assemblyName = new AssemblyName("FreeSql.DynamicCompileBuilder"); @@ -177,7 +232,8 @@ namespace FreeSql.Extensions.DynamicEntity SetPropertys(ref typeBuilder); //创建类的Type对象 - return typeBuilder.CreateType(); + var type = typeBuilder.CreateType(); + return _fsql.CodeFirst.GetTableByEntity(type); } /// @@ -226,4 +282,5 @@ namespace FreeSql.Extensions.DynamicEntity public Attribute[] Attributes { get; set; } } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 5323d7da..1973f9b2 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3519,177 +3519,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> - - - - - - - - 可自定义解析表达式 @@ -4680,12 +4509,6 @@ 超时 - - - 获取资源 - - - 使用完毕后,归还资源 @@ -4761,12 +4584,6 @@ 资源对象 - - - 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 - - 资源对象 - 归还对象给对象池的时候触发 diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index a8e21139..1f2d5e38 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -342,6 +342,7 @@ namespace FreeSql.Internal.CommonProvider [typeof(string)] = typeof(DbDataReader).GetMethod("GetString", new Type[] { typeof(int) }), //[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }) 有些驱动不兼容 }; + public static Dictionary> _dicMethodDataReaderGetValueOverride = new Dictionary>(); public static MethodInfo MethodStringContains = typeof(string).GetMethod("Contains", new[] { typeof(string) }); public static MethodInfo MethodStringStartsWith = typeof(string).GetMethod("StartsWith", new[] { typeof(string) }); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs index 87f8e031..3908e4c0 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs @@ -744,8 +744,11 @@ namespace FreeSql.Internal.CommonProvider _orm.Aop.AuditDataReaderHandler == null && _dicMethodDataReaderGetValue.TryGetValue(col.Attribute.MapType.NullableTypeOrThis(), out var drGetValueMethod)) { + if (_dicMethodDataReaderGetValueOverride.TryGetValue(_orm.Ado.DataType, out var drDictOverride) && drDictOverride.TryGetValue(col.Attribute.MapType.NullableTypeOrThis(), out var drDictOverrideGetValueMethod)) + drGetValueMethod = drDictOverrideGetValueMethod; + Expression drvalExp = Expression.Call(rowExp, drGetValueMethod, Expression.Constant(colidx)); - if (col.CsType.IsNullableType()) drvalExp = Expression.Convert(drvalExp, col.CsType); + if (col.CsType.IsNullableType() || drGetValueMethod.ReturnType != col.CsType) drvalExp = Expression.Convert(drvalExp, col.CsType); drvalExp = Expression.Condition(Expression.Call(rowExp, _MethodDataReaderIsDBNull, Expression.Constant(colidx)), Expression.Default(col.CsType), drvalExp); if (drvalType.IsArray || drvalType.IsEnum || Utils.dicExecuteArrayRowReadClassOrTuple.ContainsKey(drvalType)) diff --git a/Providers/FreeSql.Provider.MySql/MySqlProvider.cs b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs index 42cdb1cc..d75fd27f 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlProvider.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs @@ -2,8 +2,10 @@ using FreeSql.Internal.CommonProvider; using FreeSql.MySql.Curd; using System; +using System.Collections.Generic; using System.Data.Common; using System.Linq.Expressions; +using System.Reflection; using System.Threading; namespace FreeSql.MySql @@ -35,8 +37,9 @@ namespace FreeSql.MySql return null; }); - Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); - Select0Provider._dicMethodDataReaderGetValue[typeof(DateTimeOffset)] = typeof(DbDataReader).GetMethod("GetDateTime", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.MySql] = new Dictionary(); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.MySql][typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.MySql][typeof(DateTimeOffset)] = typeof(DbDataReader).GetMethod("GetDateTime", new Type[] { typeof(int) }); } public override ISelect CreateSelectProvider(object dywhere) => new MySqlSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); diff --git a/Providers/FreeSql.Provider.Oracle/OracleProvider.cs b/Providers/FreeSql.Provider.Oracle/OracleProvider.cs index e63680c8..92792c51 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleProvider.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleProvider.cs @@ -6,6 +6,8 @@ using System.Text.RegularExpressions; using System.Collections.Concurrent; using System.Threading; using System.IO; +using System.Collections.Generic; +using System.Reflection; namespace FreeSql.Oracle { @@ -30,13 +32,14 @@ namespace FreeSql.Oracle this.CodeFirst = new OracleCodeFirst(this, this.InternalCommonUtils, this.InternalCommonExpression); #if oledb - Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); - Select0Provider._dicMethodDataReaderGetValue[typeof(bool)] = typeof(DbDataReader).GetMethod("GetBoolean", new Type[] { typeof(int) }); - Select0Provider._dicMethodDataReaderGetValue[typeof(int)] = typeof(DbDataReader).GetMethod("GetDecimal", new Type[] { typeof(int) }); - Select0Provider._dicMethodDataReaderGetValue[typeof(long)] = typeof(DbDataReader).GetMethod("GetDecimal", new Type[] { typeof(int) }); - Select0Provider._dicMethodDataReaderGetValue[typeof(decimal)] = typeof(DbDataReader).GetMethod("GetDecimal", new Type[] { typeof(int) }); - Select0Provider._dicMethodDataReaderGetValue[typeof(DateTime)] = typeof(DbDataReader).GetMethod("GetDateTime", new Type[] { typeof(int) }); - Select0Provider._dicMethodDataReaderGetValue[typeof(string)] = typeof(DbDataReader).GetMethod("GetString", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.Oracle] = new Dictionary(); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.Oracle][typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.Oracle][typeof(bool)] = typeof(DbDataReader).GetMethod("GetBoolean", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.Oracle][typeof(int)] = typeof(DbDataReader).GetMethod("GetDecimal", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.Oracle][typeof(long)] = typeof(DbDataReader).GetMethod("GetDecimal", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.Oracle][typeof(decimal)] = typeof(DbDataReader).GetMethod("GetDecimal", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.Oracle][typeof(DateTime)] = typeof(DbDataReader).GetMethod("GetDateTime", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.Oracle][typeof(string)] = typeof(DbDataReader).GetMethod("GetString", new Type[] { typeof(int) }); this.Aop.CommandBefore += (_, e) => { From 050e240b18b046a72e854f28a64eaa9497c0ca50 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 5 May 2023 17:15:00 +0800 Subject: [PATCH 35/58] v3.2.695 #1497 #1487 #1481 #1483 #1477 #1502 #1501 #1504 #1505 --- Directory.Build.props | 2 +- .../FreeSql.Extensions.AggregateRoot.csproj | 2 +- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- .../FreeSql.Extensions.Linq.csproj | 2 +- .../FreeSql.Generator.csproj | 2 +- FreeSql.All/FreeSql.All.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.Repository/FreeSql.Repository.csproj | 2 +- FreeSql/FreeSql.csproj | 2 +- FreeSql/FreeSql.xml | 254 ++++++++++++++++++ .../FreeSql.Provider.ClickHouse.csproj | 2 +- .../FreeSql.Provider.Custom.csproj | 2 +- .../FreeSql.Provider.Dameng.csproj | 2 +- .../FreeSql.Provider.Firebird.csproj | 2 +- .../FreeSql.Provider.GBase.csproj | 2 +- .../FreeSql.Provider.KingbaseES.csproj | 2 +- .../FreeSql.Provider.MsAccess.csproj | 2 +- .../FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- .../FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.OracleOledb.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.QuestDb.csproj | 2 +- .../FreeSql.Provider.ShenTong.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- ...FreeSql.Provider.SqlServerForSystem.csproj | 2 +- .../FreeSql.Provider.Sqlite.csproj | 2 +- .../FreeSql.Provider.SqliteCore.csproj | 2 +- .../FreeSql.Provider.Xugu.csproj | 2 +- 32 files changed, 285 insertions(+), 31 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 4dd4f9c6..9a49c8f9 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index 1e502027..de9d42d7 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index 9242ecca..c8a04873 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.694 + 3.2.695 diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index e35f408e..2cd19007 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index 02a84304..a4745a4a 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.694 + 3.2.695 diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index ccb9fbd4..de1c52c8 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 0b77520c..498e17ec 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.694 + 3.2.695 diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index 7f5672c8..2c50dd25 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 2661d8d6..e4df2953 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 016585b3..26222ad9 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index b3a6be7e..a161bcc8 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 1973f9b2..3839bb08 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1073,6 +1073,55 @@ + + + 动态创建实体类型 + + + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性-支持多个 + + + + + 配置父类 + + 父类类型 + + + + + Emit动态创建出Class - Type + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -3519,6 +3568,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> + + + + + + + + 可自定义解析表达式 @@ -4509,6 +4729,12 @@ 超时 + + + 获取资源 + + + 使用完毕后,归还资源 @@ -4584,6 +4810,12 @@ 资源对象 + + + 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 + + 资源对象 + 归还对象给对象池的时候触发 @@ -5509,6 +5741,28 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 + + + 动态构建Class Type + + + + + + 根据字典,创建 table 对应的实体对象 + + + + + + + + 根据实体对象,创建 table 对应的字典 + + + + + C#: that >= between && that <= and diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index 617cb6fa..f016cce2 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index 4c978c13..1590cdfa 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index f55fae61..5a91f3ae 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index 5ba2819c..a0e04eca 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 58d191f1..0dae5c06 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index 820fbf23..2197eb50 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index 528adf18..94be9898 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 4e124b6b..a50b8335 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index dbe3c4d9..1533f0d5 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index 37e51e4d..cb1ac4a1 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index f323c4a8..3e6ad900 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index 68ca179d..c091d7f4 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index f994cdaf..0adcf34a 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index 5ea2e720..f0f75a90 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index 01de7738..68544f42 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index 3785c10c..dcc40361 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index 1302f57f..8e9304de 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index 6a196a59..a62ea881 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index 1150c21c..ee3732a4 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.694 + 3.2.695 diff --git a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj index 86020339..18e0290c 100644 --- a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj +++ b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.694 + 3.2.695 From 7ab1a07c7c2eeaed1787440757fc5cd5d1f83daa Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Mon, 8 May 2023 11:25:41 +0800 Subject: [PATCH 36/58] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20BulkCopyUpdate?= =?UTF-8?q?=20=E4=B8=B4=E6=97=B6=E8=A1=A8=E5=90=8D=E5=A4=A7=E5=B0=8F?= =?UTF-8?q?=E5=86=99=E9=97=AE=E9=A2=98=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Providers/FreeSql.Provider.Dameng/DamengExtensions.cs | 4 ++-- Providers/FreeSql.Provider.KingbaseES/KingbaseESExtensions.cs | 4 ++-- .../FreeSqlMySqlConnectorGlobalExtensions.cs | 4 ++-- Providers/FreeSql.Provider.Oracle/OracleExtensions.cs | 4 ++-- Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Providers/FreeSql.Provider.Dameng/DamengExtensions.cs b/Providers/FreeSql.Provider.Dameng/DamengExtensions.cs index c8ed319e..ebaa869d 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengExtensions.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengExtensions.cs @@ -40,7 +40,7 @@ public static partial class FreeSqlDamengGlobalExtensions var _table = upsert._table; var _commonUtils = upsert._commonUtils; var updateTableName = upsert._tableRule?.Invoke(_table.DbName) ?? _table.DbName; - var tempTableName = $"Temp_{Guid.NewGuid().ToString("N").ToUpper().Substring(0, 24)}"; + var tempTableName = $"TEMP_{Guid.NewGuid().ToString("N").ToUpper().Substring(0, 24)}"; if (upsert._orm.CodeFirst.IsSyncStructureToLower) tempTableName = tempTableName.ToLower(); if (upsert._orm.CodeFirst.IsSyncStructureToUpper) tempTableName = tempTableName.ToUpper(); if (upsert._connection == null && upsert._orm.Ado.TransactionCurrentThread != null) @@ -88,7 +88,7 @@ public static partial class FreeSqlDamengGlobalExtensions var _table = update._table; var _commonUtils = update._commonUtils; var updateTableName = update._tableRule?.Invoke(_table.DbName) ?? _table.DbName; - var tempTableName = $"Temp_{Guid.NewGuid().ToString("N").ToUpper().Substring(0, 24)}"; + var tempTableName = $"TEMP_{Guid.NewGuid().ToString("N").ToUpper().Substring(0, 24)}"; if (update._orm.CodeFirst.IsSyncStructureToLower) tempTableName = tempTableName.ToLower(); if (update._orm.CodeFirst.IsSyncStructureToUpper) tempTableName = tempTableName.ToUpper(); if (update._connection == null && update._orm.Ado.TransactionCurrentThread != null) diff --git a/Providers/FreeSql.Provider.KingbaseES/KingbaseESExtensions.cs b/Providers/FreeSql.Provider.KingbaseES/KingbaseESExtensions.cs index 8e2eddd9..407ba496 100644 --- a/Providers/FreeSql.Provider.KingbaseES/KingbaseESExtensions.cs +++ b/Providers/FreeSql.Provider.KingbaseES/KingbaseESExtensions.cs @@ -41,7 +41,7 @@ public static partial class FreeSqlKingbaseESGlobalExtensions var _table = upsert._table; var _commonUtils = upsert._commonUtils; var updateTableName = upsert._tableRule?.Invoke(_table.DbName) ?? _table.DbName; - var tempTableName = $"Temp_{Guid.NewGuid().ToString("N")}"; + var tempTableName = $"temp_{Guid.NewGuid().ToString("N")}"; if (upsert._orm.CodeFirst.IsSyncStructureToLower) tempTableName = tempTableName.ToLower(); if (upsert._orm.CodeFirst.IsSyncStructureToUpper) tempTableName = tempTableName.ToUpper(); if (upsert._connection == null && upsert._orm.Ado.TransactionCurrentThread != null) @@ -86,7 +86,7 @@ public static partial class FreeSqlKingbaseESGlobalExtensions var _table = update._table; var _commonUtils = update._commonUtils; var updateTableName = update._tableRule?.Invoke(_table.DbName) ?? _table.DbName; - var tempTableName = $"Temp_{Guid.NewGuid().ToString("N")}"; + var tempTableName = $"temp_{Guid.NewGuid().ToString("N")}"; if (update._orm.CodeFirst.IsSyncStructureToLower) tempTableName = tempTableName.ToLower(); if (update._orm.CodeFirst.IsSyncStructureToUpper) tempTableName = tempTableName.ToUpper(); if (update._connection == null && update._orm.Ado.TransactionCurrentThread != null) diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSqlMySqlConnectorGlobalExtensions.cs b/Providers/FreeSql.Provider.MySqlConnector/FreeSqlMySqlConnectorGlobalExtensions.cs index 4c33a1b2..a08d4e23 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSqlMySqlConnectorGlobalExtensions.cs +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSqlMySqlConnectorGlobalExtensions.cs @@ -39,7 +39,7 @@ public static class FreeSqlMySqlConnectorGlobalExtensions var _table = upsert._table; var _commonUtils = upsert._commonUtils; var updateTableName = upsert._tableRule?.Invoke(_table.DbName) ?? _table.DbName; - var tempTableName = $"Temp_{Guid.NewGuid().ToString("N")}"; + var tempTableName = $"temp_{Guid.NewGuid().ToString("N")}"; if (upsert._orm.CodeFirst.IsSyncStructureToLower) tempTableName = tempTableName.ToLower(); if (upsert._orm.CodeFirst.IsSyncStructureToUpper) tempTableName = tempTableName.ToUpper(); if (upsert._connection == null && upsert._orm.Ado.TransactionCurrentThread != null) @@ -90,7 +90,7 @@ public static class FreeSqlMySqlConnectorGlobalExtensions var _table = update._table; var _commonUtils = update._commonUtils; var updateTableName = update._tableRule?.Invoke(_table.DbName) ?? _table.DbName; - var tempTableName = $"Temp_{Guid.NewGuid().ToString("N")}"; + var tempTableName = $"temp_{Guid.NewGuid().ToString("N")}"; if (update._orm.CodeFirst.IsSyncStructureToLower) tempTableName = tempTableName.ToLower(); if (update._orm.CodeFirst.IsSyncStructureToUpper) tempTableName = tempTableName.ToUpper(); if (update._connection == null && update._orm.Ado.TransactionCurrentThread != null) diff --git a/Providers/FreeSql.Provider.Oracle/OracleExtensions.cs b/Providers/FreeSql.Provider.Oracle/OracleExtensions.cs index a61edb86..acf824a0 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleExtensions.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleExtensions.cs @@ -46,7 +46,7 @@ public static partial class FreeSqlOracleGlobalExtensions var _table = upsert._table; var _commonUtils = upsert._commonUtils; var updateTableName = upsert._tableRule?.Invoke(_table.DbName) ?? _table.DbName; - var tempTableName = $"Temp_{Guid.NewGuid().ToString("N").ToUpper().Substring(0, 24)}"; + var tempTableName = $"TEMP_{Guid.NewGuid().ToString("N").ToUpper().Substring(0, 24)}"; if (upsert._orm.CodeFirst.IsSyncStructureToLower) tempTableName = tempTableName.ToLower(); if (upsert._orm.CodeFirst.IsSyncStructureToUpper) tempTableName = tempTableName.ToUpper(); if (upsert._connection == null && upsert._orm.Ado.TransactionCurrentThread != null) @@ -94,7 +94,7 @@ public static partial class FreeSqlOracleGlobalExtensions var _table = update._table; var _commonUtils = update._commonUtils; var updateTableName = update._tableRule?.Invoke(_table.DbName) ?? _table.DbName; - var tempTableName = $"Temp_{Guid.NewGuid().ToString("N").ToUpper().Substring(0, 24)}"; + var tempTableName = $"TEMP_{Guid.NewGuid().ToString("N").ToUpper().Substring(0, 24)}"; if (update._orm.CodeFirst.IsSyncStructureToLower) tempTableName = tempTableName.ToLower(); if (update._orm.CodeFirst.IsSyncStructureToUpper) tempTableName = tempTableName.ToUpper(); if (update._connection == null && update._orm.Ado.TransactionCurrentThread != null) diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs index d67a006b..f941306f 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs @@ -56,7 +56,7 @@ public static partial class FreeSqlPostgreSQLGlobalExtensions var _table = upsert._table; var _commonUtils = upsert._commonUtils; var updateTableName = upsert._tableRule?.Invoke(_table.DbName) ?? _table.DbName; - var tempTableName = $"Temp_{Guid.NewGuid().ToString("N")}"; + var tempTableName = $"temp_{Guid.NewGuid().ToString("N")}"; if (upsert._orm.CodeFirst.IsSyncStructureToLower) tempTableName = tempTableName.ToLower(); if (upsert._orm.CodeFirst.IsSyncStructureToUpper) tempTableName = tempTableName.ToUpper(); if (upsert._connection == null && upsert._orm.Ado.TransactionCurrentThread != null) @@ -107,7 +107,7 @@ public static partial class FreeSqlPostgreSQLGlobalExtensions var _table = update._table; var _commonUtils = update._commonUtils; var updateTableName = update._tableRule?.Invoke(_table.DbName) ?? _table.DbName; - var tempTableName = $"Temp_{Guid.NewGuid().ToString("N")}"; + var tempTableName = $"temp_{Guid.NewGuid().ToString("N")}"; if (update._orm.CodeFirst.IsSyncStructureToLower) tempTableName = tempTableName.ToLower(); if (update._orm.CodeFirst.IsSyncStructureToUpper) tempTableName = tempTableName.ToUpper(); if (update._connection == null && update._orm.Ado.TransactionCurrentThread != null) From c9759bf6239e34fe032fa7fd016c7d0985ad0e0b Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Mon, 8 May 2023 11:27:26 +0800 Subject: [PATCH 37/58] v3.2.696-preview20230508 --- Directory.Build.props | 2 +- .../FreeSql.Extensions.AggregateRoot.csproj | 2 +- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- .../FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj | 2 +- Extensions/FreeSql.Generator/FreeSql.Generator.csproj | 2 +- FreeSql.All/FreeSql.All.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.Repository/FreeSql.Repository.csproj | 2 +- FreeSql/FreeSql.csproj | 2 +- .../FreeSql.Provider.ClickHouse.csproj | 2 +- .../FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj | 2 +- .../FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj | 2 +- .../FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj | 2 +- Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj | 2 +- .../FreeSql.Provider.KingbaseES.csproj | 2 +- .../FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj | 2 +- Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.OracleOledb.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj | 2 +- .../FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- .../FreeSql.Provider.SqlServerForSystem.csproj | 2 +- .../FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj | 2 +- .../FreeSql.Provider.SqliteCore.csproj | 2 +- Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj | 2 +- 31 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 9a49c8f9..f5dd6c96 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index de9d42d7..fd78a69e 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index c8a04873..5b34b637 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.695 + 3.2.696-preview20230508 diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index 2cd19007..c8471850 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index a4745a4a..f4339227 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.695 + 3.2.696-preview20230508 diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index de1c52c8..fe46d64a 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 498e17ec..7f85973a 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.695 + 3.2.696-preview20230508 diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index 2c50dd25..5f0410f8 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index e4df2953..ca92e94d 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 26222ad9..15d5da5b 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index a161bcc8..2463db1d 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index f016cce2..1e6dfa23 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index 1590cdfa..5268e225 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index 5a91f3ae..5f1be647 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index a0e04eca..e6d4e02d 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 0dae5c06..9be56e65 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index 2197eb50..8a5b3055 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index 94be9898..dcbfa404 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index a50b8335..65de63c3 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 1533f0d5..d3e77999 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index cb1ac4a1..1f83b997 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 3e6ad900..caabfab1 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index c091d7f4..564846e8 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index 0adcf34a..7d7aefe9 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index f0f75a90..53a43971 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index 68544f42..2d02ba98 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index dcc40361..2136a2c4 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index 8e9304de..75b650b7 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index a62ea881..ba63642c 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index ee3732a4..f01e581a 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.695 + 3.2.696-preview20230508 diff --git a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj index 18e0290c..bf807655 100644 --- a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj +++ b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.695 + 3.2.696-preview20230508 From 79e3dcb6156f8cd3e3e37853dc961e209a1bccfd Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 10 May 2023 01:45:42 +0800 Subject: [PATCH 38/58] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20FromQuery=20+=20?= =?UTF-8?q?WithTempQuery=20=E5=B5=8C=E5=A5=97=E6=9F=A5=E8=AF=A2=E5=A4=9A?= =?UTF-8?q?=E5=B1=82=E5=90=8E=E5=88=AB=E5=90=8D=E9=97=AE=E9=A2=98=EF=BC=9B?= =?UTF-8?q?#1510?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 18 -- .../Curd/SqlServerSelectWithTempQueryTest.cs | 169 ++++++++++++++++++ FreeSql/FreeSql.xml | 71 -------- FreeSql/Internal/CommonExpression.cs | 9 + 4 files changed, 178 insertions(+), 89 deletions(-) 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/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs index 0da2b923..bbf089be 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs @@ -9,6 +9,175 @@ namespace FreeSql.Tests.SqlServer { public class SqlServerSelectWithTempQueryTest { + [Fact] + public void Issues1510() + { + var fsql = g.mysql; + + var query = fsql.Select() + .FromQuery(fsql.Select().WithTempQuery(e => e)) + .InnerJoin(t => t.t1.Id == t.t2.T1JoinId) + .WithTempQuery(t => new + { + t.t1.Id, + t.t1.Name, + T2Id = t.t2.Id, + T2Name = t.t1.Name, + }); + var sql = query.ToSql(); + Assert.Equal(sql, @"SELECT * +FROM ( + SELECT a.`Id`, a.`Name`, htb.`Id` `T2Id`, a.`Name` `T2Name` + FROM `Issues1510T1` a + INNER JOIN ( + SELECT a.`Id`, a.`Name`, a.`T1JoinId` + FROM `Issues1510T2` a ) htb ON a.`Id` = htb.`T1JoinId` ) a"); + query.ToList(); + + query = fsql.Select() + .FromQuery(fsql.Select().WithTempQuery(e => e).WithTempQuery(e => e)) + .InnerJoin(t => t.t1.Id == t.t2.T1JoinId) + .WithTempQuery(t => new + { + t.t1.Id, + t.t1.Name, + T2Id = t.t2.Id, + T2Name = t.t1.Name, + }); + sql = query.ToSql(); + Assert.Equal(sql, @"SELECT * +FROM ( + SELECT a.`Id`, a.`Name`, htb.`Id` `T2Id`, a.`Name` `T2Name` + FROM `Issues1510T1` a + INNER JOIN ( + SELECT a.`Id`, a.`Name`, a.`T1JoinId` + FROM ( + SELECT a.`Id`, a.`Name`, a.`T1JoinId` + FROM `Issues1510T2` a ) a ) htb ON a.`Id` = htb.`T1JoinId` ) a"); + query.ToList(); + + query = fsql.Select() + .FromQuery(fsql.Select().WithTempQuery(e => new { T2 = e }).WithTempQuery(e => e.T2)) + .InnerJoin(t => t.t1.Id == t.t2.T1JoinId) + .WithTempQuery(t => new + { + t.t1.Id, + t.t1.Name, + T2Id = t.t2.Id, + T2Name = t.t1.Name, + }); + sql = query.ToSql(); + Assert.Equal(sql, @"SELECT * +FROM ( + SELECT a.`Id`, a.`Name`, htb.`Id` `T2Id`, a.`Name` `T2Name` + FROM `Issues1510T1` a + INNER JOIN ( + SELECT a.`Id`, a.`Name`, a.`T1JoinId` + FROM ( + SELECT a.`Id`, a.`Name`, a.`T1JoinId` + FROM `Issues1510T2` a ) a ) htb ON a.`Id` = htb.`T1JoinId` ) a"); + query.ToList(); + + ////////////////////////// + + var query2 = fsql.Select() + .FromQuery(fsql.Select().WithTempQuery(e => e)) + .InnerJoin(t => t.t1.Id == t.t2.T1JoinId) + .WithTempQuery(t => new + { + T1Id = t.t1.Id, + T1Name = t.t1.Name, + T2Id = t.t2.Id, + T2Name = t.t1.Name, + }); + sql = query2.ToSql(); + Assert.Equal(sql, @"SELECT * +FROM ( + SELECT a.`Id` `T1Id`, a.`Name` `T1Name`, htb.`Id` `T2Id`, a.`Name` `T2Name` + FROM `Issues1510T1` a + INNER JOIN ( + SELECT a.`Id`, a.`Name`, a.`T1JoinId` + FROM `Issues1510T2` a ) htb ON a.`Id` = htb.`T1JoinId` ) a"); + query2.ToList(); + + query2 = fsql.Select() + .FromQuery(fsql.Select().WithTempQuery(e => new { T2 = e }).WithTempQuery(e => e.T2)) + .InnerJoin(t => t.t1.Id == t.t2.T1JoinId) + .WithTempQuery(t => new + { + T1Id = t.t1.Id, + T1Name = t.t1.Name, + T2Id = t.t2.Id, + T2Name = t.t1.Name, + }); + sql = query2.ToSql(); + Assert.Equal(sql, @"SELECT * +FROM ( + SELECT a.`Id` `T1Id`, a.`Name` `T1Name`, htb.`Id` `T2Id`, a.`Name` `T2Name` + FROM `Issues1510T1` a + INNER JOIN ( + SELECT a.`Id`, a.`Name`, a.`T1JoinId` + FROM ( + SELECT a.`Id`, a.`Name`, a.`T1JoinId` + FROM `Issues1510T2` a ) a ) htb ON a.`Id` = htb.`T1JoinId` ) a"); + query2.ToList(); + + query2 = fsql.Select() + .WithTempQuery(e => e) + .FromQuery(fsql.Select()) + .InnerJoin(t => t.t1.Id == t.t2.T1JoinId) + .WithTempQuery(t => new + { + T1Id = t.t1.Id, + T1Name = t.t1.Name, + T2Id = t.t2.Id, + T2Name = t.t1.Name, + }); + sql = query2.ToSql(); + Assert.Equal(sql, @"SELECT * +FROM ( + SELECT a.`Id` `T1Id`, a.`Name` `T1Name`, htb.`Id` `T2Id`, a.`Name` `T2Name` + FROM ( + SELECT a.`Id`, a.`Name` + FROM `Issues1510T1` a ) a + INNER JOIN `Issues1510T2` htb ON a.`Id` = htb.`T1JoinId` ) a"); + query2.ToList(); + + query2 = fsql.Select() + .WithTempQuery(e => e) + .FromQuery(fsql.Select().WithTempQuery(e => e)) + .InnerJoin(t => t.t1.Id == t.t2.T1JoinId) + .WithTempQuery(t => new + { + T1Id = t.t1.Id, + T1Name = t.t1.Name, + T2Id = t.t2.Id, + T2Name = t.t1.Name, + }); + sql = query2.ToSql(); + Assert.Equal(sql, @"SELECT * +FROM ( + SELECT a.`Id` `T1Id`, a.`Name` `T1Name`, htb.`Id` `T2Id`, a.`Name` `T2Name` + FROM ( + SELECT a.`Id`, a.`Name` + FROM `Issues1510T1` a ) a + INNER JOIN ( + SELECT a.`Id`, a.`Name`, a.`T1JoinId` + FROM `Issues1510T2` a ) htb ON a.`Id` = htb.`T1JoinId` ) a"); + query2.ToList(); + } + public class Issues1510T1 + { + public long Id { get; set; } + public string Name { get; set; } + } + public class Issues1510T2 + { + public long Id { get; set; } + public string Name { get; set; } + public long T1JoinId { get; set; } + } + [Fact] public void Issues1467() { diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 3839bb08..5323d7da 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1073,55 +1073,6 @@ - - - 动态创建实体类型 - - - - - 配置Class - - 类名 - 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] - - - - - 配置属性 - - 属性名称 - 属性类型 - 属性标记的特性-支持多个 - - - - - 配置父类 - - 父类类型 - - - - - Emit动态创建出Class - Type - - - - - - 首字母小写 - - - - - - - 首字母大写 - - - - 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -5741,28 +5692,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 811cbe02..e2795d65 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -71,7 +71,16 @@ namespace FreeSql.Internal field.Append(_common.FieldAsAlias(parent.DbNestedField)); } else if (isdiymemexp && diymemexp?.ParseExpMapResult != null) + { parent.DbNestedField = diymemexp.ParseExpMapResult.DbNestedField; + if (EndsWithDbNestedField(parent.DbField, $" {parent.DbNestedField}") == false && //#1510 group by 产生的 DbField 自带 alias,因此需要此行判断 + string.IsNullOrEmpty(parent.CsName) == false && localIndex == ReadAnonymousFieldAsCsName) + { + parent.DbNestedField = GetFieldAsCsName(parent.CsName); + if (EndsWithDbNestedField(parent.DbField, parent.DbNestedField) == false) //DbField 和 CsName 相同的时候,不处理 + field.Append(_common.FieldAsAlias(parent.DbNestedField)); + } + } else if (string.IsNullOrEmpty(parent.CsName) == false) { parent.DbNestedField = GetFieldAsCsName(parent.CsName); From 02bd60be0abd342e5d5b2aa50b0e3d811df4a3a7 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 10 May 2023 02:00:43 +0800 Subject: [PATCH 39/58] v3.2.696-preview20230510 #1510 --- Directory.Build.props | 2 +- Examples/base_entity/Program.cs | 39 ++++++++++ .../FreeSql.Extensions.AggregateRoot.csproj | 2 +- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- .../FreeSql.Extensions.Linq.csproj | 2 +- .../FreeSql.Generator.csproj | 2 +- FreeSql.All/FreeSql.All.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.xml | 18 +++++ FreeSql.Repository/FreeSql.Repository.csproj | 2 +- FreeSql/FreeSql.csproj | 2 +- FreeSql/FreeSql.xml | 78 +++++++++++++++++++ .../FreeSql.Provider.ClickHouse.csproj | 2 +- .../FreeSql.Provider.Custom.csproj | 2 +- .../FreeSql.Provider.Dameng.csproj | 2 +- .../FreeSql.Provider.Firebird.csproj | 2 +- .../FreeSql.Provider.GBase.csproj | 2 +- .../FreeSql.Provider.KingbaseES.csproj | 2 +- .../FreeSql.Provider.MsAccess.csproj | 2 +- .../FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- .../FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.OracleOledb.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.QuestDb.csproj | 2 +- .../FreeSql.Provider.ShenTong.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- ...FreeSql.Provider.SqlServerForSystem.csproj | 2 +- .../FreeSql.Provider.Sqlite.csproj | 2 +- .../FreeSql.Provider.SqliteCore.csproj | 2 +- .../FreeSql.Provider.Xugu.csproj | 2 +- 34 files changed, 166 insertions(+), 31 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index f5dd6c96..8b4b9939 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 70e6687b..a3934fc7 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -483,6 +483,29 @@ namespace base_entity public string Name { get; set; } } + [Table(Name = "class_{0}")] + public class Class1111 + { + [Column(IsPrimary = true, IsIdentity = true, IsNullable = false)] + public int Id { get; set; } + + [Column(StringLength = 20, IsNullable = false)] + public string Name { get; set; } + } + + [Table(Name = "student_{0}")] + public class Student2222 + { + [Column(IsPrimary = true, IsIdentity = true, IsNullable = false)] + public int Id { get; set; } + + [Column(IsPrimary = false, IsNullable = false)] + public int ClassId { get; set; } + + [Column(StringLength = 20, IsNullable = false)] + public string Name { get; set; } + } + static void Main(string[] args) { var pams = new Dictionary(); @@ -577,6 +600,22 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion +var query2222 = fsql.Select() + .AsTable((t, o) => string.Format(o, "hash2")) + .Where(p => p.Name.Contains("search")) + .GroupBy(a => new { a.ClassId }) + .WithTempQuery(a => a.Key); +var sql11111 = fsql.Select() + .AsTable((t, o) => string.Format(o, "hash1")) + .Where(s => query2222 + .ToList(p => p.ClassId) + .Contains(s.Id)) + .ToSql(s => new + { + s.Id, + s.Name, + }); + var isusers01 = fsql.Select() .Where(e => e.Property("项目执行情况") == "结题") .GroupBy(e => new { ProjectLevel = e.Property("项目级别") }) diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index fd78a69e..840de0bf 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index 5b34b637..5230f57a 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index c8471850..fd175913 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index f4339227..4210ede7 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index fe46d64a..0dd681cf 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 7f85973a..8cbccef0 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index 5f0410f8..8dd8c2f5 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index ca92e94d..27281e2b 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 594fbad3..26522f10 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -733,6 +733,15 @@ + + + 根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类 + + + + + + 创建普通数据上下文档对象 @@ -791,5 +800,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 15d5da5b..f4db5949 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 2463db1d..68794a57 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 5323d7da..aaffe163 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -6208,3 +6208,81 @@ +ew{id=1} + + + 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 + + + + + 查询数据 + + + + + + + 查询数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} + + + 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 + + + + + 删除数据 + + + + + + + 删除数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} + + + 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 + + + + + 开启事务(不支持异步) + v1.5.0 关闭了线程事务超时自动提交的机制 + + 事务体 () => {} + + + + 开启事务(不支持异步) + v1.5.0 关闭了线程事务超时自动提交的机制 + + + 事务体 () => {} + + + + 数据库访问对象 + + + + + 所有拦截方法都在这里 + + + + + CodeFirst 模式开发相关方法 + + + + + DbFirst 模式开发相关方法 + + + + + 全局过滤设置,可默认附加为 Select/Update/Delete 条件 + + + + diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index 1e6dfa23..2dcbba14 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index 5268e225..d1bdcc4c 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index 5f1be647..e7f7effb 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index e6d4e02d..8e6e1f9e 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 9be56e65..221e7c0d 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index 8a5b3055..d7aa8bf0 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index dcbfa404..904cdd41 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 65de63c3..768dda5d 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index d3e77999..fc5543d1 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index 1f83b997..3169c1cf 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index caabfab1..e7386c9f 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index 564846e8..ba2d4371 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index 7d7aefe9..8f467470 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index 53a43971..935f5652 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index 2d02ba98..fc22128c 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index 2136a2c4..52b53085 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index 75b650b7..27538cae 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index ba63642c..78cc256c 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index f01e581a..e69db203 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230508 + 3.2.696-preview20230510 diff --git a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj index bf807655..5466113d 100644 --- a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj +++ b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230508 + 3.2.696-preview20230510 From bb1fd88f79dfbfb3efcd1f1bd6bc2e03175aa1c4 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Mon, 15 May 2023 10:53:13 +0800 Subject: [PATCH 40/58] =?UTF-8?q?-=20=E5=9F=BA=E7=B1=BB=E5=B1=9E=E6=80=A7a?= =?UTF-8?q?bstract/virtual=E6=94=AF=E6=8C=81override?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DynamicEntity/DynamicEntityTest.cs | 131 +++++++++++++++++- FreeSql/Extensions/DynamicEntityExtensions.cs | 110 ++++++++++++++- FreeSql/FreeSql.xml | 78 ----------- 3 files changed, 233 insertions(+), 86 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs b/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs index c1385540..3c988ea8 100644 --- a/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs @@ -33,12 +33,14 @@ namespace FreeSql.Tests.DynamicEntity //根据Type生成表 fsql.CodeFirst.SyncStructure(table.Type); fsql.Insert().AsType(table.Type).AppendData(instance).ExecuteAffrows(); + var objects = fsql.Select().AsType(table.Type).ToList(); } [Fact] public void AttributeTest() { - var table = fsql.CodeFirst.DynamicEntity("AttributeUsers", new TableAttribute() { Name = "T_Attribute_User" }, + var table = fsql.CodeFirst.DynamicEntity("AttributeUsers", + new TableAttribute() { Name = "T_Attribute_User" }, new IndexAttribute("Name_Index1", "Name", false)) .Property("Id", typeof(int), new ColumnAttribute() { IsPrimary = true, IsIdentity = true, Position = 1 }) @@ -80,9 +82,122 @@ namespace FreeSql.Tests.DynamicEntity //根据Type生成表 fsql.CodeFirst.SyncStructure(table.Type); fsql.Insert().AsType(table.Type).AppendData(instance).ExecuteAffrows(); + var objects = fsql.Select().AsType(table.Type).ToList(); + } + + [Fact] + public void SuperClassVirtualOverrideTest() + { + var table = fsql.CodeFirst.DynamicEntity("Role_VirtualOverride", + new TableAttribute() { Name = "T_Role_VirtualOverride" }, + new IndexAttribute("Name_Index2", "Name", false)) + .Extend(typeof(BaseModelOverride)) + .Property("Id", typeof(int), + new ColumnAttribute() { IsPrimary = true, IsIdentity = true, Position = 1 }) + .Property("Name", typeof(string), + new ColumnAttribute() { StringLength = 20, Position = 2 }) + .Property("Operators", typeof(string), true) //重写 virtual 属性 + .Build(); + var dict = new Dictionary + { + ["Name"] = "系统管理员", + ["UpdateTime"] = DateTime.Now, + ["UpdatePerson"] = "admin", + ["Operators"] = "manager" + }; + var instance = table.CreateInstance(dict); + //根据Type生成表 + fsql.CodeFirst.SyncStructure(table.Type); + fsql.Insert().AsType(table.Type).AppendData(instance).ExecuteAffrows(); + var objects = fsql.Select().AsType(table.Type).ToList(); + } + + [Fact] + public void SuperClassBaseModelAbstractTest() + { + var table = fsql.CodeFirst.DynamicEntity("Role_AbstractOverride", + new TableAttribute() { Name = "T_Role_AbstractOverride" }, + new IndexAttribute("Name_Index2", "Name", false)) + .Extend(typeof(BaseModelOverride)) + .Property("Id", typeof(int), + new ColumnAttribute() { IsPrimary = true, IsIdentity = true, Position = 1 }) + .Property("Name", typeof(string), + new ColumnAttribute() { StringLength = 20, Position = 2 }) + .Property("Operators", typeof(string), true) //重写 abstract 属性 + .Build(); + var dict = new Dictionary + { + ["Name"] = "系统管理员", + ["UpdateTime"] = DateTime.Now, + ["UpdatePerson"] = "admin", + ["Operators"] = "manager" + }; + var instance = table.CreateInstance(dict); + //根据Type生成表 + fsql.CodeFirst.SyncStructure(table.Type); + fsql.Insert().AsType(table.Type).AppendData(instance).ExecuteAffrows(); + var objects = fsql.Select().AsType(table.Type).ToList(); + } + + [Fact] + public void SuperClassBaseModelAbstractAndVirtualTest() + { + var table = fsql.CodeFirst.DynamicEntity("Role_AbstractAndVirtualOverride", + new TableAttribute() { Name = "Role_AbstractAndVirtualOverride" }, + new IndexAttribute("Name_Index2", "Name", false)) + .Extend(typeof(BaseModelOverride)) + .Property("Id", typeof(int), + new ColumnAttribute() { IsPrimary = true, IsIdentity = true, Position = 1 }) + .Property("Name", typeof(string), + new ColumnAttribute() { StringLength = 20, Position = 2 }) + .Property("Operators", typeof(string), true) //重写 abstract 属性 + .Property("Operators2", typeof(string), true) //重写 virtual 属性 + .Build(); + var dict = new Dictionary + { + ["Name"] = "系统管理员", + ["UpdateTime"] = DateTime.Now, + ["UpdatePerson"] = "admin", + ["Operators"] = "manager", + ["Operators2"] = "manager2" + }; + var instance = table.CreateInstance(dict); + //根据Type生成表 + fsql.CodeFirst.SyncStructure(table.Type); + fsql.Insert().AsType(table.Type).AppendData(instance).ExecuteAffrows(); + var objects = fsql.Select().AsType(table.Type).ToList(); } } + public class BaseModel + { + [Column(Position = 99)] public DateTime UpdateTime { get; set; } + + [Column(Position = 100, StringLength = 20)] + public string UpdatePerson { get; set; } + } + + public class BaseModelOverride + { + [Column(Position = 99)] public DateTime UpdateTime { get; set; } + + [Column(Position = 100, StringLength = 20)] + public string UpdatePerson { get; set; } + + public virtual string Operators { get; set; } + } + + public abstract class BaseModelAbstract + { + [Column(Position = 99)] public DateTime UpdateTime { get; set; } + + [Column(Position = 100, StringLength = 20)] + public string UpdatePerson { get; set; } + + public abstract string Operators { get; set; } + } + + public abstract class BaseModelAbstractAndVirtual { [Column(Position = 99)] public DateTime UpdateTime @@ -95,5 +210,17 @@ namespace FreeSql.Tests.DynamicEntity { get; set; } + + public abstract string Operators + { + get; set; + } + + + public virtual string Operators2 + { + get; set; + } } -} \ No newline at end of file +} + diff --git a/FreeSql/Extensions/DynamicEntityExtensions.cs b/FreeSql/Extensions/DynamicEntityExtensions.cs index f4659e1e..0ae32e0e 100644 --- a/FreeSql/Extensions/DynamicEntityExtensions.cs +++ b/FreeSql/Extensions/DynamicEntityExtensions.cs @@ -1,7 +1,7 @@ // by: Daily #if net40 || NETSTANDARD2_0 -# else +#else using FreeSql; using FreeSql.DataAnnotations; @@ -23,7 +23,8 @@ public static class FreeSqlGlobalDynamicEntityExtensions /// 动态构建Class Type /// /// - public static DynamicCompileBuilder DynamicEntity(this ICodeFirst codeFirst, string className, params Attribute[] attributes) + public static DynamicCompileBuilder DynamicEntity(this ICodeFirst codeFirst, string className, + params Attribute[] attributes) { return new DynamicCompileBuilder((codeFirst as CodeFirstProvider)._orm, className, attributes); } @@ -43,8 +44,10 @@ public static class FreeSqlGlobalDynamicEntityExtensions if (dict.ContainsKey(key) == false) continue; table.ColumnsByCs[key].SetValue(instance, dict[key]); } + return instance; } + /// /// 根据实体对象,创建 table 对应的字典 /// @@ -94,12 +97,59 @@ namespace FreeSql.Extensions.DynamicEntity /// 属性类型 /// 属性标记的特性-支持多个 /// - public DynamicCompileBuilder Property(string propertyName, Type propertyType, params Attribute[] attributes) + public DynamicCompileBuilder Property(string propertyName, Type propertyType, + params Attribute[] attributes) { _properties.Add(new DynamicPropertyInfo() { PropertyName = propertyName, PropertyType = propertyType, + DefaultValue = null, + Attributes = attributes + }); + return this; + } + + /// + /// 配置属性 + /// + /// 属性名称 + /// 属性类型 + /// 该属性是否重写父类属性 + /// 属性标记的特性-支持多个 + /// + public DynamicCompileBuilder Property(string propertyName, Type propertyType, bool isOverride, + params Attribute[] attributes) + { + _properties.Add(new DynamicPropertyInfo() + { + PropertyName = propertyName, + PropertyType = propertyType, + DefaultValue = null, + IsOverride = isOverride, + Attributes = attributes + }); + return this; + } + + /// + /// 配置属性 + /// + /// 属性名称 + /// 属性类型 + /// 该属性是否重写父类属性 + /// 属性默认值 + /// 属性标记的特性-支持多个 + /// + public DynamicCompileBuilder Property(string propertyName, Type propertyType, bool isOverride, + object defaultValue, params Attribute[] attributes) + { + _properties.Add(new DynamicPropertyInfo() + { + PropertyName = propertyName, + PropertyType = propertyType, + DefaultValue = null, + IsOverride = isOverride, Attributes = attributes }); return this; @@ -162,10 +212,17 @@ namespace FreeSql.Extensions.DynamicEntity var field = typeBuilder.DefineField($"_{FirstCharToLower(propertyName)}", propertyType, FieldAttributes.Private); var firstCharToUpper = FirstCharToUpper(propertyName); + + MethodAttributes maAttributes = MethodAttributes.Public; + + if (pinfo.IsOverride) + { + maAttributes = MethodAttributes.Public | MethodAttributes.Virtual; + } + //设置属性方法 - var methodGet = typeBuilder.DefineMethod($"Get{firstCharToUpper}", MethodAttributes.Public, - propertyType, null); - var methodSet = typeBuilder.DefineMethod($"Set{firstCharToUpper}", MethodAttributes.Public, null, + var methodGet = typeBuilder.DefineMethod($"get_{firstCharToUpper}", maAttributes, propertyType, null); + var methodSet = typeBuilder.DefineMethod($"set_{firstCharToUpper}", maAttributes, null, new Type[] { propertyType }); var ilOfGet = methodGet.GetILGenerator(); @@ -179,12 +236,27 @@ namespace FreeSql.Extensions.DynamicEntity ilOfSet.Emit(OpCodes.Stfld, field); ilOfSet.Emit(OpCodes.Ret); + + //是否重写 + if (pinfo.IsOverride) + { + //重写Get、Set方法 + OverrideProperty(ref typeBuilder, methodGet, PropertyMethodEnum.GET, pinfo.PropertyName); + OverrideProperty(ref typeBuilder, methodSet, PropertyMethodEnum.SET, pinfo.PropertyName); + } + //设置属性 var propertyBuilder = typeBuilder.DefineProperty(propertyName, PropertyAttributes.None, propertyType, null); propertyBuilder.SetGetMethod(methodGet); propertyBuilder.SetSetMethod(methodSet); + //设置默认值 + if (pinfo.DefaultValue != null) + { + propertyBuilder.SetConstant(pinfo.DefaultValue); + } + foreach (var pinfoAttribute in pinfo.Attributes) { //设置特性 @@ -208,6 +280,23 @@ namespace FreeSql.Extensions.DynamicEntity propertyBuilder.SetCustomAttribute(customAttributeBuilder); } + /// + /// Override属性 + /// + /// + private void OverrideProperty(ref TypeBuilder typeBuilder, MethodBuilder methodBuilder, + PropertyMethodEnum methodEnum, + string propertyName) + { + //查找父类的属性信息 + var propertyInfo = typeBuilder.BaseType.GetProperty(propertyName); + if (propertyInfo == null) return; + var pm = methodEnum == PropertyMethodEnum.GET ? propertyInfo.GetGetMethod() : propertyInfo.GetSetMethod(); + //重写父类GET SET 方法 + typeBuilder.DefineMethodOverride(methodBuilder, pm); + } + + /// /// Emit动态创建出Class - Type /// @@ -233,6 +322,7 @@ namespace FreeSql.Extensions.DynamicEntity //创建类的Type对象 var type = typeBuilder.CreateType(); + return _fsql.CodeFirst.GetTableByEntity(type); } @@ -279,8 +369,16 @@ namespace FreeSql.Extensions.DynamicEntity { public string PropertyName { get; set; } = string.Empty; public Type PropertyType { get; set; } + public object DefaultValue { get; set; } + public bool IsOverride { get; set; } = false; public Attribute[] Attributes { get; set; } } + + enum PropertyMethodEnum + { + GET, + SET + } } } #endif \ No newline at end of file diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index aaffe163..5323d7da 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -6208,81 +6208,3 @@ -ew{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 查询数据 - - - - - - - 查询数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 删除数据 - - - - - - - 删除数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 开启事务(不支持异步) - v1.5.0 关闭了线程事务超时自动提交的机制 - - 事务体 () => {} - - - - 开启事务(不支持异步) - v1.5.0 关闭了线程事务超时自动提交的机制 - - - 事务体 () => {} - - - - 数据库访问对象 - - - - - 所有拦截方法都在这里 - - - - - CodeFirst 模式开发相关方法 - - - - - DbFirst 模式开发相关方法 - - - - - 全局过滤设置,可默认附加为 Select/Update/Delete 条件 - - - - From 4732ccde87e725dc14efabb517db1a85f8022cdf Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Mon, 15 May 2023 16:34:55 +0800 Subject: [PATCH 41/58] =?UTF-8?q?-=20=E5=9F=BA=E7=B1=BB=E5=B1=9E=E6=80=A7a?= =?UTF-8?q?bstract/virtual=E6=94=AF=E6=8C=81override=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=B1=9E=E6=80=A7=E9=BB=98=E8=AE=A4=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DynamicEntity/DynamicEntityTest.cs | 55 ++++++---- FreeSql/Extensions/DynamicEntityExtensions.cs | 100 +++++++++++++++--- FreeSql/FreeSql.xml | 98 +++++++++++++++++ 3 files changed, 219 insertions(+), 34 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs b/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs index 3c988ea8..ec135fcb 100644 --- a/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/DynamicEntity/DynamicEntityTest.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using FreeSql.DataAnnotations; using FreeSql.Extensions.DynamicEntity; +using Newtonsoft.Json; using Xunit; namespace FreeSql.Tests.DynamicEntity @@ -118,7 +119,7 @@ namespace FreeSql.Tests.DynamicEntity var table = fsql.CodeFirst.DynamicEntity("Role_AbstractOverride", new TableAttribute() { Name = "T_Role_AbstractOverride" }, new IndexAttribute("Name_Index2", "Name", false)) - .Extend(typeof(BaseModelOverride)) + .Extend(typeof(BaseModelAbstract)) .Property("Id", typeof(int), new ColumnAttribute() { IsPrimary = true, IsIdentity = true, Position = 1 }) .Property("Name", typeof(string), @@ -145,7 +146,7 @@ namespace FreeSql.Tests.DynamicEntity var table = fsql.CodeFirst.DynamicEntity("Role_AbstractAndVirtualOverride", new TableAttribute() { Name = "Role_AbstractAndVirtualOverride" }, new IndexAttribute("Name_Index2", "Name", false)) - .Extend(typeof(BaseModelOverride)) + .Extend(typeof(BaseModelAbstractAndVirtual)) .Property("Id", typeof(int), new ColumnAttribute() { IsPrimary = true, IsIdentity = true, Position = 1 }) .Property("Name", typeof(string), @@ -167,6 +168,32 @@ namespace FreeSql.Tests.DynamicEntity fsql.Insert().AsType(table.Type).AppendData(instance).ExecuteAffrows(); var objects = fsql.Select().AsType(table.Type).ToList(); } + + [Fact] + public void DefaultValueTest() + { + var table = fsql.CodeFirst.DynamicEntity("NormalUsers") + .Property("Id", typeof(string)) + .Property("Age", typeof(int), false, 12) + .Property("Longs", typeof(long), false, 16666) + .Property("Dates", typeof(DateTime), false, "2023-05-15") + .Property("Name", typeof(char), false, '我') + .Property("Address", typeof(bool), false, false) //设置默认值 + .Property("Money", typeof(double), false, 265421.02) //设置默认值 + .Property("MoneyFloat", typeof(float), false, 26543.02) //设置默认值 + .Property("MoneyDecimal", typeof(decimal), true, 2663.12560) //设置默认值 + .Build(); + + var dict = new Dictionary + { + ["Id"] = Guid.NewGuid().ToString() + }; + var instance = table.CreateInstance(dict); + //根据Type生成表 + fsql.CodeFirst.SyncStructure(table.Type); + fsql.Insert().AsType(table.Type).AppendData(instance).ExecuteAffrows(); + var objects = fsql.Select().AsType(table.Type).ToList(); + } } public class BaseModel @@ -199,28 +226,14 @@ namespace FreeSql.Tests.DynamicEntity public abstract class BaseModelAbstractAndVirtual { - [Column(Position = 99)] - public DateTime UpdateTime - { - get; set; - } + [Column(Position = 99)] public DateTime UpdateTime { get; set; } [Column(Position = 100, StringLength = 20)] - public string UpdatePerson - { - get; set; - } + public string UpdatePerson { get; set; } - public abstract string Operators - { - get; set; - } + public abstract string Operators { get; set; } - public virtual string Operators2 - { - get; set; - } + public virtual string Operators2 { get; set; } } -} - +} \ No newline at end of file diff --git a/FreeSql/Extensions/DynamicEntityExtensions.cs b/FreeSql/Extensions/DynamicEntityExtensions.cs index 0ae32e0e..45873720 100644 --- a/FreeSql/Extensions/DynamicEntityExtensions.cs +++ b/FreeSql/Extensions/DynamicEntityExtensions.cs @@ -11,11 +11,15 @@ using FreeSql.Internal.Model; using System; using System.Collections; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; +using System.Net.NetworkInformation; using System.Reflection; using System.Reflection.Emit; +using System.Runtime.Serialization; using System.Security.Cryptography; using System.Text; +using System.Xml.Serialization; public static class FreeSqlGlobalDynamicEntityExtensions { @@ -39,6 +43,12 @@ public static class FreeSqlGlobalDynamicEntityExtensions { if (table == null || dict == null) return null; var instance = table.Type.CreateInstanceGetDefaultValue(); + //加载默认值 + var defaultValueInit = table.Type.GetMethod("DefaultValueInit"); + if (defaultValueInit != null) + { + defaultValueInit.Invoke(instance, new object[0]); + } foreach (var key in table.ColumnsByCs.Keys) { if (dict.ContainsKey(key) == false) continue; @@ -148,7 +158,7 @@ namespace FreeSql.Extensions.DynamicEntity { PropertyName = propertyName, PropertyType = propertyType, - DefaultValue = null, + DefaultValue = defaultValue, IsOverride = isOverride, Attributes = attributes }); @@ -176,7 +186,7 @@ namespace FreeSql.Extensions.DynamicEntity if (tableAttribute == null) continue; - var classCtorInfo = tableAttribute.GetType().GetConstructor(new Type[] { }); + var classCtorInfo = tableAttribute.GetType().GetConstructor(Type.EmptyTypes); var propertyInfos = tableAttribute.GetType().GetProperties().Where(p => p.CanWrite == true).ToArray(); @@ -202,6 +212,7 @@ namespace FreeSql.Extensions.DynamicEntity private void SetPropertys(ref TypeBuilder typeBuilder) { + var defaultValues = new Dictionary(); foreach (var pinfo in _properties) { if (pinfo == null) @@ -210,11 +221,12 @@ namespace FreeSql.Extensions.DynamicEntity var propertyType = pinfo.PropertyType; //设置字段 var field = typeBuilder.DefineField($"_{FirstCharToLower(propertyName)}", propertyType, - FieldAttributes.Private); + FieldAttributes.Private | FieldAttributes.HasDefault); var firstCharToUpper = FirstCharToUpper(propertyName); MethodAttributes maAttributes = MethodAttributes.Public; + //是否重写 if (pinfo.IsOverride) { maAttributes = MethodAttributes.Public | MethodAttributes.Virtual; @@ -251,33 +263,95 @@ namespace FreeSql.Extensions.DynamicEntity propertyBuilder.SetGetMethod(methodGet); propertyBuilder.SetSetMethod(methodSet); - //设置默认值 - if (pinfo.DefaultValue != null) - { - propertyBuilder.SetConstant(pinfo.DefaultValue); - } - foreach (var pinfoAttribute in pinfo.Attributes) { //设置特性 SetPropertyAttribute(ref propertyBuilder, pinfoAttribute); } + + if (pinfo.DefaultValue != null) + { + defaultValues.Add(field, pinfo.DefaultValue); + } + } + + //动态构建方法,设置默认值 + var methodDefaultValue = typeBuilder.DefineMethod($"DefaultValueInit", MethodAttributes.Public, null, null); + var methodDefaultValueLlGenerator = methodDefaultValue.GetILGenerator(); + foreach (var kv in defaultValues) + { + methodDefaultValueLlGenerator.Emit(OpCodes.Ldarg_0); + OpCodesAdapter(ref methodDefaultValueLlGenerator, kv.Key, kv.Value); + methodDefaultValueLlGenerator.Emit(OpCodes.Stfld, kv.Key); + } + + methodDefaultValueLlGenerator.Emit(OpCodes.Ret); + } + + //IL命令类型适配 + private void OpCodesAdapter(ref ILGenerator generator, FieldInfo info, object value) + { + var fieldTypeName = info.FieldType.Name; + switch (fieldTypeName) + { + case "Int32": + generator.Emit(OpCodes.Ldc_I4, Convert.ToInt32(value)); + break; + case "Boolean": + generator.Emit(OpCodes.Ldc_I4, Convert.ToInt32(value)); + break; + case "Char": + generator.Emit(OpCodes.Ldc_I4, Convert.ToChar(value)); + break; + case "String": + generator.Emit(OpCodes.Ldstr, Convert.ToString(value)); + break; + case "DateTime": + generator.Emit(OpCodes.Ldstr, Convert.ToString(value)); + generator.Emit(OpCodes.Call, typeof(DateTime).GetMethod("Parse", new[] { typeof(string) })); + break; + case "Int64": + generator.Emit(OpCodes.Ldc_I4, Convert.ToString(value)); + generator.Emit(OpCodes.Conv_I8); + break; + case "Double": + generator.Emit(OpCodes.Ldc_R8, Convert.ToDouble(value)); + break; + case "Single": + generator.Emit(OpCodes.Ldc_R4, Convert.ToSingle(value)); + break; + case "Decimal": + Console.WriteLine(Convert.ToString(value)); + generator.Emit(OpCodes.Ldstr, Convert.ToString(value)); + generator.Emit(OpCodes.Call, typeof(Decimal).GetMethod("Parse", new[] { typeof(string) })); + break; } } private void SetPropertyAttribute(ref PropertyBuilder propertyBuilder, T tAttribute) { if (tAttribute == null) return; - var propertyInfos = tAttribute.GetType().GetProperties().Where(p => p.CanWrite == true).ToArray(); - var constructor = tAttribute.GetType().GetConstructor(new Type[] { }); + var constructor = tAttribute.GetType().GetConstructor(Type.EmptyTypes); var propertyValues = new ArrayList(); foreach (var propertyInfo in propertyInfos) propertyValues.Add(propertyInfo.GetValue(tAttribute)); - var customAttributeBuilder = - new CustomAttributeBuilder(constructor, new object[0], propertyInfos, propertyValues.ToArray()); + //可能存在有参构造 + //if (constructor == null) + //{ + // var constructorTypes = propertyInfos.Select(p => p.PropertyType).ToList(); + // constructor = tAttribute.GetType().GetConstructor(constructorTypes.ToArray()); + // var customAttributeBuilder = new CustomAttributeBuilder(constructor, constructorTypes.ToArray(), + // propertyInfos, propertyValues.ToArray()); + // propertyBuilder.SetCustomAttribute(customAttributeBuilder); + //} + //else + //{ + var customAttributeBuilder = new CustomAttributeBuilder(constructor, new object[0], propertyInfos, + propertyValues.ToArray()); propertyBuilder.SetCustomAttribute(customAttributeBuilder); + // } } /// diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 5323d7da..8cd7ad2d 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1073,6 +1073,82 @@ + + + 动态创建实体类型 + + + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性默认值 + 属性标记的特性-支持多个 + + + + + 配置父类 + + 父类类型 + + + + + Override属性 + + + + + + Emit动态创建出Class - Type + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -5692,6 +5768,28 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 + + + 动态构建Class Type + + + + + + 根据字典,创建 table 对应的实体对象 + + + + + + + + 根据实体对象,创建 table 对应的字典 + + + + + C#: that >= between && that <= and From 1d41088aff3173ee469ea2a52ff27448f3021683 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 17 May 2023 15:38:53 +0800 Subject: [PATCH 42/58] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20Oracle=20?= =?UTF-8?q?=E6=8F=92=E5=85=A5=20LONG=20RAW=20=E7=B1=BB=E5=9E=8B=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 135 +++++++++++++++++- Examples/base_entity/base_entity.xml | 70 +++++++++ .../Oracle/CustomOracleCodeFirst.cs | 6 + .../DamengCodeFirst.cs | 6 + .../Dameng/OdbcDamengCodeFirst.cs | 6 + .../Oracle/OdbcOracleCodeFirst.cs | 6 + .../OracleCodeFirst.cs | 6 + .../FreeSql.Provider.Oracle/OracleDbFirst.cs | 2 +- .../FreeSql.Provider.Oracle/OracleUtils.cs | 4 + .../OracleOledbUtils.cs | 4 + 10 files changed, 241 insertions(+), 4 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index a3934fc7..cd3ca9e9 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -14,6 +14,7 @@ using Npgsql; using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.ComponentModel; using System.Data.Common; using System.Data.Odbc; using System.Data.SqlClient; @@ -571,8 +572,8 @@ namespace base_entity //.UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=toc;Pooling=true;Maximum Pool Size=2") //.UseNameConvert(FreeSql.Internal.NameConvertType.ToLower) - //.UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2") - //.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) + .UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2") + .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) //.UseConnectionString(FreeSql.DataType.Dameng, "server=127.0.0.1;port=5236;user id=2user;password=123456789;database=2user;poolsize=5;min pool size=1") //.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) @@ -600,7 +601,39 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion -var query2222 = fsql.Select() + fsql.Delete().Where("1=1").ExecuteAffrows(); + var longRawData = Encoding.UTF8.GetBytes(string.Join(",", Enumerable.Range(1, 2000).Select(a => "中国人"))); + fsql.Insert(new OracleLongRaw1 { data = longRawData }).NoneParameter(false).ExecuteAffrows(); + fsql.Insert(new OracleLongRaw1 { data = longRawData }).NoneParameter(true).ExecuteAffrows(); + var longRaw1 = fsql.Select().ToList(); + + MarketingRestrictions restrictions = new MarketingRestrictions(); + + if (restrictions.Id == Guid.Empty) + { + restrictions.CreatedBy = 100; + } + else + { + restrictions.UpdatedBy = 100; + restrictions.UpdatedTime = DateTime.Now; + } + + int ret = fsql.InsertOrUpdate() + .SetSource(restrictions) + .UpdateColumns(r => new { + r.Describe, + r.IsLimitUsePoints, + r.Status, + r.StartTime, + r.EndTime, + r.UpdatedBy, + r.UpdatedTime + }) + .ExecuteAffrows(); + + + var query2222 = fsql.Select() .AsTable((t, o) => string.Format(o, "hash2")) .Where(p => p.Name.Contains("search")) .GroupBy(a => new { a.ClassId }) @@ -2193,4 +2226,100 @@ var sql11111 = fsql.Select() [Column(MapType = typeof(string))] public Achievement Group { get; set; } } + [Description("营销限制表")] + [Table(Name = "MarketingRestrictions")] + public class MarketingRestrictions + { + /// + /// 主键标识 + /// + [Description("主键标识")] + [Column(DbType = "uniqueidentifier", IsPrimary = true)] + public Guid Id { get; set; } + /// + /// 商户应用Id + /// + [Description("商户应用Id")] + [Column(DbType = "varchar(32) not null")] + public string MchtAppId { get; set; } + /// + /// 描述 + /// + [Description("描述")] + [Column(DbType = "nvarchar(500) not null")] + public string Describe { get; set; } + /// + /// 状态:0、关闭 1、启用 + /// + [Description("状态:0、关闭 1、启用")] + [Column(DbType = "smallint")] + public sbyte Status { get; set; } + /// + /// 是否限制使用积分:0、否 1、是 + /// + [Description("是否限制使用积分:0、否 1、是")] + [Column(DbType = "smallint")] + public sbyte IsLimitUsePoints { get; set; } + /// + /// 开始时间 + /// + [Description("开始时间")] + [Column(DbType = "datetime")] + public DateTime StartTime { get; set; } + /// + /// 结束时间 + /// + [Description("结束时间")] + [Column(DbType = "datetime")] + public DateTime EndTime { get; set; } + /// + /// 创建人Id + /// + [Description("创建人Id")] + [Column(DbType = "bigint")] + public long CreatedBy { get; set; } + /// + /// 创建时间 + /// + [Description("创建时间")] + [Column(DbType = "datetime", ServerTime = DateTimeKind.Local, CanUpdate = false)] + public DateTime CreatedTime { get; set; } + /// + /// 最后编辑人Id + /// + [Description("最后编辑人Id")] + [Column(DbType = "bigint")] + public long? UpdatedBy { get; set; } + /// + /// 最后编辑时间 + /// + [Description("最后编辑时间")] + [Column(DbType = "datetime")] + public DateTime? UpdatedTime { get; set; } + /// + /// 是否删除:0、否 1、是 + /// + [Description("是否删除:0、否 1、是")] + [Column(DbType = "smallint")] + public sbyte Deleted { get; set; } + /// + /// 删除人Id + /// + [Description("删除人Id")] + [Column(DbType = "bigint")] + public long? DeletedBy { get; set; } + /// + /// 删除时间 + /// + [Description("删除时间")] + [Column(DbType = "datetime")] + public DateTime? DeletedTime { get; set; } + } + + class OracleLongRaw1 + { + public Guid id { get; set; } + [Column(DbType = "long raw")] + public byte[] data { get; set; } + } } diff --git a/Examples/base_entity/base_entity.xml b/Examples/base_entity/base_entity.xml index f7603c7f..31b00137 100644 --- a/Examples/base_entity/base_entity.xml +++ b/Examples/base_entity/base_entity.xml @@ -180,6 +180,76 @@ 更新时间 + + + 主键标识 + + + + + 商户应用Id + + + + + 描述 + + + + + 状态:0、关闭 1、启用 + + + + + 是否限制使用积分:0、否 1、是 + + + + + 开始时间 + + + + + 结束时间 + + + + + 创建人Id + + + + + 创建时间 + + + + + 最后编辑人Id + + + + + 最后编辑时间 + + + + + 是否删除:0、否 1、是 + + + + + 删除人Id + + + + + 删除时间 + + 角色表 diff --git a/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleCodeFirst.cs b/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleCodeFirst.cs index 3f7b4f6d..fc03a10c 100644 --- a/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleCodeFirst.cs +++ b/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleCodeFirst.cs @@ -463,6 +463,12 @@ and not exists(select 1 from all_constraints where constraint_name = a.index_nam else if (sqlType.StartsWith("NCLOB")) { } + else if (sqlType.StartsWith("RAW")) + { + } + else if (sqlType.StartsWith("LONG RAW")) + { + } else if (char_used.ToLower() == "c") sqlType += sqlType.StartsWith("N") ? $"({data_length / 2})" : $"({data_length / 4} CHAR)"; else if (char_used.ToLower() == "b") diff --git a/Providers/FreeSql.Provider.Dameng/DamengCodeFirst.cs b/Providers/FreeSql.Provider.Dameng/DamengCodeFirst.cs index cc406cc5..0724ba61 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengCodeFirst.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengCodeFirst.cs @@ -466,6 +466,12 @@ and not exists(select 1 from all_constraints where index_name = a.index_name and else if (sqlType.StartsWith("NCLOB")) { } + else if (sqlType.StartsWith("RAW")) + { + } + else if (sqlType.StartsWith("LONG RAW")) + { + } else if (sqlType.StartsWith("TEXT")) { } diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengCodeFirst.cs index 02c6b9b2..2de3d900 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengCodeFirst.cs @@ -461,6 +461,12 @@ and not exists(select 1 from all_constraints where index_name = a.index_name and else if (sqlType.StartsWith("BLOB")) { } + else if (sqlType.StartsWith("RAW")) + { + } + else if (sqlType.StartsWith("LONG RAW")) + { + } else if (sqlType == "REAL" || sqlType == "DOUBLE" || sqlType == "FLOAT") { } diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs index ad673448..0ce0c843 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs @@ -465,6 +465,12 @@ and not exists(select 1 from all_constraints where constraint_name = a.index_nam else if (sqlType.StartsWith("NCLOB")) { } + else if (sqlType.StartsWith("RAW")) + { + } + else if (sqlType.StartsWith("LONG RAW")) + { + } else if (char_used.ToLower() == "c") sqlType += sqlType.StartsWith("N") ? $"({data_length / 2})" : $"({data_length / 4} CHAR)"; else if (char_used.ToLower() == "b") diff --git a/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs b/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs index 68fc77d8..80f32817 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs @@ -500,6 +500,12 @@ and not exists(select 1 from all_constraints where constraint_name = a.index_nam else if (sqlType.StartsWith("NCLOB")) { } + else if (sqlType.StartsWith("RAW")) + { + } + else if (sqlType.StartsWith("LONG RAW")) + { + } else if (char_used.ToLower() == "c") sqlType += sqlType.StartsWith("N") ? $"({data_length / 2})" : $"({data_length / 4} CHAR)"; else if (char_used.ToLower() == "b") diff --git a/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs b/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs index 22dc1baa..98b7e57b 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs @@ -106,7 +106,7 @@ namespace FreeSql.Oracle return OleDbType.VarBinary; case "long raw": _dicDbToCs.TryAdd(dbfull, _dicDbToCs["blob"]); - return OleDbType.VarBinary; + return OleDbType.LongVarBinary; case "binary_float": _dicDbToCs.TryAdd(dbfull, _dicDbToCs["float(63)"]); return OleDbType.Single; diff --git a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs index 58d8e616..f0c2fcb8 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleUtils.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs @@ -51,6 +51,10 @@ namespace FreeSql.Oracle case OracleDbType.Blob: ret = new OracleParameter { ParameterName = QuoteParamterName(parameterName), OracleDbType = dbtype2, Value = value }; break; + case OracleDbType.Raw: + case OracleDbType.LongRaw: + ret = new OracleParameter { ParameterName = QuoteParamterName(parameterName), OracleDbType = dbtype2, Value = value }; + break; } } _params?.Add(ret); diff --git a/Providers/FreeSql.Provider.OracleOledb/OracleOledbUtils.cs b/Providers/FreeSql.Provider.OracleOledb/OracleOledbUtils.cs index 408cee75..575774d6 100644 --- a/Providers/FreeSql.Provider.OracleOledb/OracleOledbUtils.cs +++ b/Providers/FreeSql.Provider.OracleOledb/OracleOledbUtils.cs @@ -55,6 +55,10 @@ namespace FreeSql.Oracle if (col.DbPrecision != 0) ret.Precision = col.DbPrecision; if (col.DbScale != 0) ret.Scale = col.DbScale; break; + case OleDbType.VarBinary: + case OleDbType.LongVarBinary: + ret = new OleDbParameter { ParameterName = QuoteParamterName(parameterName), OleDbType = dbtype2, Value = value }; + break; } } _params?.Add(ret); From ce26c7eddbf1a93a314655cd4a37a054850a097d Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 17 May 2023 15:41:02 +0800 Subject: [PATCH 43/58] v3.2.696-preview20230517 #1515 --- Directory.Build.props | 2 +- .../FreeSql.Extensions.AggregateRoot.csproj | 2 +- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- .../FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj | 2 +- Extensions/FreeSql.Generator/FreeSql.Generator.csproj | 2 +- FreeSql.All/FreeSql.All.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.Repository/FreeSql.Repository.csproj | 2 +- FreeSql/FreeSql.csproj | 2 +- .../FreeSql.Provider.ClickHouse.csproj | 2 +- .../FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj | 2 +- .../FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj | 2 +- .../FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj | 2 +- Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj | 2 +- .../FreeSql.Provider.KingbaseES.csproj | 2 +- .../FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj | 2 +- Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.OracleOledb.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj | 2 +- .../FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- .../FreeSql.Provider.SqlServerForSystem.csproj | 2 +- .../FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj | 2 +- .../FreeSql.Provider.SqliteCore.csproj | 2 +- Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj | 2 +- 31 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 8b4b9939..48b09f65 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index 840de0bf..ab8794dd 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index 5230f57a..4edd711e 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index fd175913..36077648 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index 4210ede7..3cdc667c 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index 0dd681cf..85ee523a 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 8cbccef0..73f34c38 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index 8dd8c2f5..65d98287 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 27281e2b..fa124828 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index f4db5949..d4b4d75e 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 68794a57..c51d2b7d 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index 2dcbba14..eede7ebc 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index d1bdcc4c..f11e863a 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index e7f7effb..f99571d4 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index 8e6e1f9e..abb90621 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 221e7c0d..73fbbbbd 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index d7aa8bf0..0322e0be 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index 904cdd41..e35bb1d6 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 768dda5d..bb35ee53 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index fc5543d1..14e2df56 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index 3169c1cf..eec77ea6 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index e7386c9f..063ed687 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index ba2d4371..cc8cbd23 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index 8f467470..e2763070 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index 935f5652..fbcb8607 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index fc22128c..bb050885 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index 52b53085..cd7daee2 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index 27538cae..1e23b90c 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index 78cc256c..bbece790 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index e69db203..7e2ba18e 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230510 + 3.2.696-preview20230517 diff --git a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj index 5466113d..04331e9b 100644 --- a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj +++ b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230510 + 3.2.696-preview20230517 From e79860164d5d12e4f7df747f0e29503dff301cb7 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 18 May 2023 11:27:23 +0800 Subject: [PATCH 44/58] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=88=86=E8=A1=A8=20IUpdate/IDelete=20AsTable=20?= =?UTF-8?q?=E4=B8=8D=E7=94=9F=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 62 ++++++++++++ Examples/base_entity/base_entity.xml | 46 +++++++++ FreeSql.DbContext/FreeSql.DbContext.xml | 18 ---- FreeSql/FreeSql.xml | 98 ------------------- .../Internal/CommonProvider/DeleteProvider.cs | 8 +- .../Internal/CommonProvider/UpdateProvider.cs | 8 +- 6 files changed, 120 insertions(+), 120 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index cd3ca9e9..21e5ca4f 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -601,6 +601,10 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + var sqlastable1 = fsql.Select(101).AsTable((t, o) => "current_detail_230501").ToSql(); + var sqlastable2 = fsql.Update(101).AsTable("current_detail_230501").Set(t => t.StatuId, 1).ToSql(); + var sqlastable3 = fsql.Delete(101).AsTable("current_detail_230501").ToSql(); + fsql.Delete().Where("1=1").ExecuteAffrows(); var longRawData = Encoding.UTF8.GetBytes(string.Join(",", Enumerable.Range(1, 2000).Select(a => "中国人"))); fsql.Insert(new OracleLongRaw1 { data = longRawData }).NoneParameter(false).ExecuteAffrows(); @@ -2322,4 +2326,62 @@ var sql11111 = fsql.Select() [Column(DbType = "long raw")] public byte[] data { get; set; } } + + [Table(Name = "current_detail_{yyMM01}", AsTable = "recordDate=2022-12-01(1 month)", DisableSyncStructure = true)] + public class CurrentDetail + { + [Column(IsPrimary = true)] + public long Id { get; set; } + + public DateTime CreateTime { get; set; } = DateTime.Now; + + /// + /// 创建日期 + /// + public DateTime RecordDate { get; set; } + + /// + /// 创建小时 + /// + public int RecordHour { get; set; } + + /// + /// 根据当前分钟数规整到10分钟的倍数 + /// 例如 21分=>20分 + /// + public int RecordMinute { get; set; } + + + /// + /// 记录时间 + /// + public DateTime RecordTime { get; set; } + + /// + /// 设备Code + /// + public int DeviceCode { get; set; } + + /// + /// 控制器序列号 + /// + public string TerminalSequence { get; set; } + + /// + /// 平均值 + /// + public float AvgValue { get; set; } + + /// + /// 路数 + /// + public int RouteNum { get; set; } + + /// + /// 相类型 + /// + public int PhaseTypeId { get; set; } + + public int StatuId { get; set; } + } } diff --git a/Examples/base_entity/base_entity.xml b/Examples/base_entity/base_entity.xml index 31b00137..3c3ca2c9 100644 --- a/Examples/base_entity/base_entity.xml +++ b/Examples/base_entity/base_entity.xml @@ -250,6 +250,52 @@ 删除时间 + + + 创建日期 + + + + + 创建小时 + + + + + 根据当前分钟数规整到10分钟的倍数 + 例如 21分=>20分 + + + + + 记录时间 + + + + + 设备Code + + + + + 控制器序列号 + + + + + 平均值 + + + + + 路数 + + + + + 相类型 + + 角色表 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/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 8cd7ad2d..5323d7da 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1073,82 +1073,6 @@ - - - 动态创建实体类型 - - - - - 配置Class - - 类名 - 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] - - - - - 配置属性 - - 属性名称 - 属性类型 - 属性标记的特性-支持多个 - - - - - 配置属性 - - 属性名称 - 属性类型 - 该属性是否重写父类属性 - 属性标记的特性-支持多个 - - - - - 配置属性 - - 属性名称 - 属性类型 - 该属性是否重写父类属性 - 属性默认值 - 属性标记的特性-支持多个 - - - - - 配置父类 - - 父类类型 - - - - - Override属性 - - - - - - Emit动态创建出Class - Type - - - - - - 首字母小写 - - - - - - - 首字母大写 - - - - 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -5768,28 +5692,6 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 - - - 动态构建Class Type - - - - - - 根据字典,创建 table 对应的实体对象 - - - - - - - - 根据实体对象,创建 table 对应的字典 - - - - - C#: that >= between && that <= and diff --git a/FreeSql/Internal/CommonProvider/DeleteProvider.cs b/FreeSql/Internal/CommonProvider/DeleteProvider.cs index 58bca8e8..52279892 100644 --- a/FreeSql/Internal/CommonProvider/DeleteProvider.cs +++ b/FreeSql/Internal/CommonProvider/DeleteProvider.cs @@ -196,8 +196,9 @@ namespace FreeSql.Internal.CommonProvider } var sb = new StringBuilder(); - if (_table.AsTableImpl != null) + if (_table.AsTableImpl != null && _tableRule != null && string.IsNullOrWhiteSpace(_tableRule(_table.DbName)) == true) { + var oldTableRule = _tableRule; var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils); foreach (var name in names) { @@ -206,6 +207,7 @@ namespace FreeSql.Internal.CommonProvider _interceptSql?.Invoke(sb); fetch(sb); } + _tableRule = oldTableRule; return; } @@ -229,8 +231,9 @@ namespace FreeSql.Internal.CommonProvider } var sb = new StringBuilder(); - if (_table.AsTableImpl != null) + if (_table.AsTableImpl != null && _tableRule != null && string.IsNullOrWhiteSpace(_tableRule(_table.DbName)) == true) { + var oldTableRule = _tableRule; var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils); foreach (var name in names) { @@ -239,6 +242,7 @@ namespace FreeSql.Internal.CommonProvider _interceptSql?.Invoke(sb); await fetchAsync(sb); } + _tableRule = oldTableRule; return; } diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index ddf65a6a..4593f830 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -1004,8 +1004,9 @@ namespace FreeSql.Internal.CommonProvider ToSqlWhere(newwhere); var sb = new StringBuilder(); - if (_table.AsTableImpl != null) + if (_table.AsTableImpl != null && _tableRule != null && string.IsNullOrWhiteSpace(_tableRule(_table.DbName)) == true) { + var oldTableRule = _tableRule; var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils); foreach (var name in names) { @@ -1013,6 +1014,7 @@ namespace FreeSql.Internal.CommonProvider ToSqlExtension110(sb.Clear(), true); fetch(sb); } + _tableRule = oldTableRule; return; } @@ -1036,8 +1038,9 @@ namespace FreeSql.Internal.CommonProvider ToSqlWhere(newwhere); var sb = new StringBuilder(); - if (_table.AsTableImpl != null) + if (_table.AsTableImpl != null && _tableRule != null && string.IsNullOrWhiteSpace(_tableRule(_table.DbName)) == true) { + var oldTableRule = _tableRule; var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils); foreach (var name in names) { @@ -1045,6 +1048,7 @@ namespace FreeSql.Internal.CommonProvider ToSqlExtension110(sb.Clear(), true); await fetchAsync(sb); } + _tableRule = oldTableRule; return; } From e7177991ad6675c585b2041c5e26463b68d929bd Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 18 May 2023 11:30:40 +0800 Subject: [PATCH 45/58] v3.2.696-preview20230518 --- Directory.Build.props | 2 +- .../FreeSql.Extensions.AggregateRoot.csproj | 2 +- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- .../FreeSql.Extensions.Linq.csproj | 2 +- .../FreeSql.Generator.csproj | 2 +- FreeSql.All/FreeSql.All.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.xml | 18 ++++ FreeSql.Repository/FreeSql.Repository.csproj | 2 +- FreeSql/FreeSql.csproj | 2 +- FreeSql/FreeSql.xml | 98 +++++++++++++++++++ .../FreeSql.Provider.ClickHouse.csproj | 2 +- .../FreeSql.Provider.Custom.csproj | 2 +- .../FreeSql.Provider.Dameng.csproj | 2 +- .../FreeSql.Provider.Firebird.csproj | 2 +- .../FreeSql.Provider.GBase.csproj | 2 +- .../FreeSql.Provider.KingbaseES.csproj | 2 +- .../FreeSql.Provider.MsAccess.csproj | 2 +- .../FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- .../FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.OracleOledb.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.QuestDb.csproj | 2 +- .../FreeSql.Provider.ShenTong.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- ...FreeSql.Provider.SqlServerForSystem.csproj | 2 +- .../FreeSql.Provider.Sqlite.csproj | 2 +- .../FreeSql.Provider.SqliteCore.csproj | 2 +- .../FreeSql.Provider.Xugu.csproj | 2 +- 33 files changed, 147 insertions(+), 31 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 48b09f65..ca86c52d 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index ab8794dd..60e72b33 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index 4edd711e..c9d443f3 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index 36077648..cfbd14a6 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index 3cdc667c..cbb2deb7 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index 85ee523a..7b01e022 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 73f34c38..2ed1ffba 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index 65d98287..883fc61c 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index fa124828..a9e30414 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 594fbad3..26522f10 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -733,6 +733,15 @@ + + + 根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类 + + + + + + 创建普通数据上下文档对象 @@ -791,5 +800,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index d4b4d75e..7c7f02db 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index c51d2b7d..eb9c4197 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 5323d7da..8cd7ad2d 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1073,6 +1073,82 @@ + + + 动态创建实体类型 + + + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性默认值 + 属性标记的特性-支持多个 + + + + + 配置父类 + + 父类类型 + + + + + Override属性 + + + + + + Emit动态创建出Class - Type + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -5692,6 +5768,28 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 + + + 动态构建Class Type + + + + + + 根据字典,创建 table 对应的实体对象 + + + + + + + + 根据实体对象,创建 table 对应的字典 + + + + + C#: that >= between && that <= and diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index eede7ebc..d04daed3 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index f11e863a..eceb77e0 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index f99571d4..c5f6fe7b 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index abb90621..bfe53aff 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 73fbbbbd..564fb5d5 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index 0322e0be..b87a5bd5 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index e35bb1d6..2d267248 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index bb35ee53..d0984932 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 14e2df56..7af11820 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index eec77ea6..a23839fd 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 063ed687..74528c22 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index cc8cbd23..0f341ea3 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index e2763070..ba4a99a5 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index fbcb8607..a3a2b6e2 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index bb050885..00fece90 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index cd7daee2..ed611701 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index 1e23b90c..a1812564 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index bbece790..ca28cb21 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index 7e2ba18e..c008b061 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230517 + 3.2.696-preview20230518 diff --git a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj index 04331e9b..b3d30118 100644 --- a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj +++ b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230517 + 3.2.696-preview20230518 From 76b18d84a79e5d3d9761fa18a1d1ccf8ee339dc0 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Sat, 20 May 2023 17:02:07 +0800 Subject: [PATCH 46/58] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20MySqlProvider=20?= =?UTF-8?q?.NetFramework=20=E4=B8=8B=E5=8F=AF=E8=83=BD=E6=8A=A5=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E7=B1=BB=E5=9E=8B=E9=94=99=E8=AF=AF=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FreeSql.Provider.MySql/MySqlProvider.cs | 53 ++--- .../PostgreSQLProvider.cs | 155 +++++++------- .../QuestDbProvider.cs | 197 +++++++++--------- .../SqlServerProvider.cs | 9 +- .../FreeSql.Provider.Sqlite/SqliteProvider.cs | 9 +- .../FreeSql.Provider.Xugu/XuguProvider.cs | 147 ++++++------- 6 files changed, 300 insertions(+), 270 deletions(-) diff --git a/Providers/FreeSql.Provider.MySql/MySqlProvider.cs b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs index d75fd27f..63bda072 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlProvider.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs @@ -13,33 +13,37 @@ namespace FreeSql.MySql public class MySqlProvider : BaseDbProvider, IFreeSql { - static MySqlProvider() + static int _firstInit = 1; + static void InitInternal() { - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisPoint)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisLineString)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisPolygon)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisMultiPoint)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisMultiLineString)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisMultiPolygon)] = true; - - var MethodMygisGeometryParse = typeof(MygisGeometry).GetMethod("Parse", new[] { typeof(string) }); - Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, Type type) => + if (Interlocked.Exchange(ref _firstInit, 0) == 1) //不能放在 static ctor .NetFramework 可能报初始化类型错误 { - switch (type.FullName) - { - case "MygisPoint": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisPoint))); - case "MygisLineString": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisLineString))); - case "MygisPolygon": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisPolygon))); - case "MygisMultiPoint": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisMultiPoint))); - case "MygisMultiLineString": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisMultiLineString))); - case "MygisMultiPolygon": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisMultiPolygon))); - } - return null; - }); + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisPoint)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisLineString)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisPolygon)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisMultiPoint)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisMultiLineString)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisMultiPolygon)] = true; - Select0Provider._dicMethodDataReaderGetValueOverride[DataType.MySql] = new Dictionary(); - Select0Provider._dicMethodDataReaderGetValueOverride[DataType.MySql][typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); - Select0Provider._dicMethodDataReaderGetValueOverride[DataType.MySql][typeof(DateTimeOffset)] = typeof(DbDataReader).GetMethod("GetDateTime", new Type[] { typeof(int) }); + var MethodMygisGeometryParse = typeof(MygisGeometry).GetMethod("Parse", new[] { typeof(string) }); + Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, Type type) => + { + switch (type.FullName) + { + case "MygisPoint": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisPoint))); + case "MygisLineString": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisLineString))); + case "MygisPolygon": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisPolygon))); + case "MygisMultiPoint": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisMultiPoint))); + case "MygisMultiLineString": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisMultiLineString))); + case "MygisMultiPolygon": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisMultiPolygon))); + } + return null; + }); + + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.MySql] = new Dictionary(); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.MySql][typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); + Select0Provider._dicMethodDataReaderGetValueOverride[DataType.MySql][typeof(DateTimeOffset)] = typeof(DbDataReader).GetMethod("GetDateTime", new Type[] { typeof(int) }); + } } public override ISelect CreateSelectProvider(object dywhere) => new MySqlSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); @@ -50,6 +54,7 @@ namespace FreeSql.MySql public MySqlProvider(string masterConnectionString, string[] slaveConnectionString, Func connectionFactory = null) { + InitInternal(); this.InternalCommonUtils = new MySqlUtils(this); this.InternalCommonExpression = new MySqlExpression(this.InternalCommonUtils); diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs index 3ee230ca..eb5dc682 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs @@ -21,91 +21,95 @@ namespace FreeSql.PostgreSQL public class PostgreSQLProvider : BaseDbProvider, IFreeSql { - static PostgreSQLProvider() + static int _firstInit = 1; + static void InitInternal() { - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BigInteger)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BitArray)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPoint)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlLine)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlLSeg)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlBox)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPath)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPolygon)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlCircle)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof((IPAddress Address, int Subnet))] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(IPAddress)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PhysicalAddress)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; + if (Interlocked.Exchange(ref _firstInit, 0) == 1) //不能放在 static ctor .NetFramework 可能报初始化类型错误 + { + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BigInteger)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BitArray)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPoint)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlLine)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlLSeg)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlBox)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPath)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPolygon)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlCircle)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof((IPAddress Address, int Subnet))] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(IPAddress)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PhysicalAddress)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisPoint)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisLineString)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisPolygon)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisMultiPoint)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisMultiLineString)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisMultiPolygon)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisGeometry)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisGeometryCollection)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisPoint)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisLineString)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisPolygon)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisMultiPoint)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisMultiLineString)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisMultiPolygon)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisGeometry)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisGeometryCollection)] = true; #if nts - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.Point)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.LineString)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.Polygon)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.MultiPoint)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.MultiLineString)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.MultiPolygon)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.Geometry)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.GeometryCollection)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.Point)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.LineString)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.Polygon)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.MultiPoint)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.MultiLineString)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.MultiPolygon)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.Geometry)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NetTopologySuite.Geometries.GeometryCollection)] = true; #endif - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(Dictionary)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JToken)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JObject)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JArray)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(Dictionary)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JToken)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JObject)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JArray)] = true; - var MethodJTokenFromObject = typeof(JToken).GetMethod("FromObject", new[] { typeof(object) }); - var MethodJObjectFromObject = typeof(JObject).GetMethod("FromObject", new[] { typeof(object) }); - var MethodJArrayFromObject = typeof(JArray).GetMethod("FromObject", new[] { typeof(object) }); - var MethodJTokenParse = typeof(JToken).GetMethod("Parse", new[] { typeof(string) }); - var MethodJObjectParse = typeof(JObject).GetMethod("Parse", new[] { typeof(string) }); - var MethodJArrayParse = typeof(JArray).GetMethod("Parse", new[] { typeof(string) }); - var MethodJsonConvertDeserializeObject = typeof(JsonConvert).GetMethod("DeserializeObject", new[] { typeof(string), typeof(Type) }); - var MethodToString = typeof(Utils).GetMethod("ToStringConcat", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(object) }, null); - Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, Type type) => - { - switch (type.FullName) + var MethodJTokenFromObject = typeof(JToken).GetMethod("FromObject", new[] { typeof(object) }); + var MethodJObjectFromObject = typeof(JObject).GetMethod("FromObject", new[] { typeof(object) }); + var MethodJArrayFromObject = typeof(JArray).GetMethod("FromObject", new[] { typeof(object) }); + var MethodJTokenParse = typeof(JToken).GetMethod("Parse", new[] { typeof(string) }); + var MethodJObjectParse = typeof(JObject).GetMethod("Parse", new[] { typeof(string) }); + var MethodJArrayParse = typeof(JArray).GetMethod("Parse", new[] { typeof(string) }); + var MethodJsonConvertDeserializeObject = typeof(JsonConvert).GetMethod("DeserializeObject", new[] { typeof(string), typeof(Type) }); + var MethodToString = typeof(Utils).GetMethod("ToStringConcat", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(object) }, null); + Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, Type type) => { - case "Newtonsoft.Json.Linq.JToken": + switch (type.FullName) + { + case "Newtonsoft.Json.Linq.JToken": + return Expression.IfThenElse( + Expression.TypeIs(valueExp, typeof(string)), + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJTokenParse, Expression.Convert(valueExp, typeof(string))), typeof(JToken))), + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJTokenFromObject, valueExp), typeof(JToken)))); + case "Newtonsoft.Json.Linq.JObject": + return Expression.IfThenElse( + Expression.TypeIs(valueExp, typeof(string)), + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJObjectParse, Expression.Convert(valueExp, typeof(string))), typeof(JObject))), + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJObjectFromObject, valueExp), typeof(JObject)))); + case "Newtonsoft.Json.Linq.JArray": + return Expression.IfThenElse( + Expression.TypeIs(valueExp, typeof(string)), + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJArrayParse, Expression.Convert(valueExp, typeof(string))), typeof(JArray))), + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJArrayFromObject, valueExp), typeof(JArray)))); + case "Npgsql.LegacyPostgis.PostgisGeometry": + return Expression.Return(returnTarget, valueExp); + case "NetTopologySuite.Geometries.Geometry": + return Expression.Return(returnTarget, valueExp); + } + if (typeof(IList).IsAssignableFrom(type)) return Expression.IfThenElse( Expression.TypeIs(valueExp, typeof(string)), - Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJTokenParse, Expression.Convert(valueExp, typeof(string))), typeof(JToken))), - Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJTokenFromObject, valueExp), typeof(JToken)))); - case "Newtonsoft.Json.Linq.JObject": - return Expression.IfThenElse( - Expression.TypeIs(valueExp, typeof(string)), - Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJObjectParse, Expression.Convert(valueExp, typeof(string))), typeof(JObject))), - Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJObjectFromObject, valueExp), typeof(JObject)))); - case "Newtonsoft.Json.Linq.JArray": - return Expression.IfThenElse( - Expression.TypeIs(valueExp, typeof(string)), - Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJArrayParse, Expression.Convert(valueExp, typeof(string))), typeof(JArray))), - Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJArrayFromObject, valueExp), typeof(JArray)))); - case "Npgsql.LegacyPostgis.PostgisGeometry": - return Expression.Return(returnTarget, valueExp); - case "NetTopologySuite.Geometries.Geometry": - return Expression.Return(returnTarget, valueExp); - } - if (typeof(IList).IsAssignableFrom(type)) - return Expression.IfThenElse( - Expression.TypeIs(valueExp, typeof(string)), - Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJsonConvertDeserializeObject, Expression.Convert(valueExp, typeof(string)), Expression.Constant(type, typeof(Type))), type)), - Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJsonConvertDeserializeObject, Expression.Convert(Expression.Call(MethodToString, valueExp), typeof(string)), Expression.Constant(type, typeof(Type))), type))); - return null; - }); - - Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJsonConvertDeserializeObject, Expression.Convert(valueExp, typeof(string)), Expression.Constant(type, typeof(Type))), type)), + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJsonConvertDeserializeObject, Expression.Convert(Expression.Call(MethodToString, valueExp), typeof(string)), Expression.Constant(type, typeof(Type))), type))); + return null; + }); + + Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); + } } public override ISelect CreateSelectProvider(object dywhere) => new PostgreSQLSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); @@ -116,6 +120,7 @@ namespace FreeSql.PostgreSQL public PostgreSQLProvider(string masterConnectionString, string[] slaveConnectionString, Func connectionFactory = null) { + InitInternal(); this.InternalCommonUtils = new PostgreSQLUtils(this); this.InternalCommonExpression = new PostgreSQLExpression(this.InternalCommonUtils); diff --git a/Providers/FreeSql.Provider.QuestDb/QuestDbProvider.cs b/Providers/FreeSql.Provider.QuestDb/QuestDbProvider.cs index f7a16dd8..f937b829 100644 --- a/Providers/FreeSql.Provider.QuestDb/QuestDbProvider.cs +++ b/Providers/FreeSql.Provider.QuestDb/QuestDbProvider.cs @@ -21,104 +21,108 @@ namespace FreeSql.QuestDb { public class QuestDbProvider : BaseDbProvider, IFreeSql { - static QuestDbProvider() + static int _firstInit = 1; + static void InitInternal() { - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BigInteger)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BitArray)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPoint)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlLine)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlLSeg)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlBox)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPath)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPolygon)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlCircle)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof((IPAddress Address, int Subnet))] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(IPAddress)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PhysicalAddress)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; - - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(Dictionary)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JToken)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JObject)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JArray)] = true; - - var MethodJTokenFromObject = typeof(JToken).GetMethod("FromObject", new[] { typeof(object) }); - var MethodJObjectFromObject = typeof(JObject).GetMethod("FromObject", new[] { typeof(object) }); - var MethodJArrayFromObject = typeof(JArray).GetMethod("FromObject", new[] { typeof(object) }); - var MethodJTokenParse = typeof(JToken).GetMethod("Parse", new[] { typeof(string) }); - var MethodJObjectParse = typeof(JObject).GetMethod("Parse", new[] { typeof(string) }); - var MethodJArrayParse = typeof(JArray).GetMethod("Parse", new[] { typeof(string) }); - var MethodJsonConvertDeserializeObject = - typeof(JsonConvert).GetMethod("DeserializeObject", new[] { typeof(string), typeof(Type) }); - var MethodToString = typeof(Utils).GetMethod("ToStringConcat", BindingFlags.Public | BindingFlags.Static, - null, new[] { typeof(object) }, null); - Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add( - (LabelTarget returnTarget, Expression valueExp, Type type) => - { - switch (type.FullName) - { - case "Newtonsoft.Json.Linq.JToken": - return Expression.IfThenElse( - Expression.TypeIs(valueExp, typeof(string)), - Expression.Return(returnTarget, - Expression.TypeAs( - Expression.Call(MethodJTokenParse, - Expression.Convert(valueExp, typeof(string))), typeof(JToken))), - Expression.Return(returnTarget, - Expression.TypeAs(Expression.Call(MethodJTokenFromObject, valueExp), - typeof(JToken)))); - case "Newtonsoft.Json.Linq.JObject": - return Expression.IfThenElse( - Expression.TypeIs(valueExp, typeof(string)), - Expression.Return(returnTarget, - Expression.TypeAs( - Expression.Call(MethodJObjectParse, - Expression.Convert(valueExp, typeof(string))), typeof(JObject))), - Expression.Return(returnTarget, - Expression.TypeAs(Expression.Call(MethodJObjectFromObject, valueExp), - typeof(JObject)))); - case "Newtonsoft.Json.Linq.JArray": - return Expression.IfThenElse( - Expression.TypeIs(valueExp, typeof(string)), - Expression.Return(returnTarget, - Expression.TypeAs( - Expression.Call(MethodJArrayParse, - Expression.Convert(valueExp, typeof(string))), typeof(JArray))), - Expression.Return(returnTarget, - Expression.TypeAs(Expression.Call(MethodJArrayFromObject, valueExp), - typeof(JArray)))); - case "Npgsql.LegacyPostgis.PostgisGeometry": - return Expression.Return(returnTarget, valueExp); - case "NetTopologySuite.Geometries.Geometry": - return Expression.Return(returnTarget, valueExp); - } - - if (typeof(IList).IsAssignableFrom(type)) - return Expression.IfThenElse( - Expression.TypeIs(valueExp, typeof(string)), - Expression.Return(returnTarget, - Expression.TypeAs( - Expression.Call(MethodJsonConvertDeserializeObject, - Expression.Convert(valueExp, typeof(string)), - Expression.Constant(type, typeof(Type))), type)), - Expression.Return(returnTarget, - Expression.TypeAs( - Expression.Call(MethodJsonConvertDeserializeObject, - Expression.Convert(Expression.Call(MethodToString, valueExp), typeof(string)), - Expression.Constant(type, typeof(Type))), type))); - return null; - }); - - Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = - typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); - - QuestDbContainer.Initialize(service => + if (Interlocked.Exchange(ref _firstInit, 0) == 1) //不能放在 static ctor .NetFramework 可能报初始化类型错误 { - service.AddHttpClient(); - }); + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BigInteger)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BitArray)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPoint)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlLine)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlLSeg)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlBox)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPath)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPolygon)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlCircle)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof((IPAddress Address, int Subnet))] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(IPAddress)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PhysicalAddress)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; + + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(Dictionary)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JToken)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JObject)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JArray)] = true; + + var MethodJTokenFromObject = typeof(JToken).GetMethod("FromObject", new[] { typeof(object) }); + var MethodJObjectFromObject = typeof(JObject).GetMethod("FromObject", new[] { typeof(object) }); + var MethodJArrayFromObject = typeof(JArray).GetMethod("FromObject", new[] { typeof(object) }); + var MethodJTokenParse = typeof(JToken).GetMethod("Parse", new[] { typeof(string) }); + var MethodJObjectParse = typeof(JObject).GetMethod("Parse", new[] { typeof(string) }); + var MethodJArrayParse = typeof(JArray).GetMethod("Parse", new[] { typeof(string) }); + var MethodJsonConvertDeserializeObject = + typeof(JsonConvert).GetMethod("DeserializeObject", new[] { typeof(string), typeof(Type) }); + var MethodToString = typeof(Utils).GetMethod("ToStringConcat", BindingFlags.Public | BindingFlags.Static, + null, new[] { typeof(object) }, null); + Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add( + (LabelTarget returnTarget, Expression valueExp, Type type) => + { + switch (type.FullName) + { + case "Newtonsoft.Json.Linq.JToken": + return Expression.IfThenElse( + Expression.TypeIs(valueExp, typeof(string)), + Expression.Return(returnTarget, + Expression.TypeAs( + Expression.Call(MethodJTokenParse, + Expression.Convert(valueExp, typeof(string))), typeof(JToken))), + Expression.Return(returnTarget, + Expression.TypeAs(Expression.Call(MethodJTokenFromObject, valueExp), + typeof(JToken)))); + case "Newtonsoft.Json.Linq.JObject": + return Expression.IfThenElse( + Expression.TypeIs(valueExp, typeof(string)), + Expression.Return(returnTarget, + Expression.TypeAs( + Expression.Call(MethodJObjectParse, + Expression.Convert(valueExp, typeof(string))), typeof(JObject))), + Expression.Return(returnTarget, + Expression.TypeAs(Expression.Call(MethodJObjectFromObject, valueExp), + typeof(JObject)))); + case "Newtonsoft.Json.Linq.JArray": + return Expression.IfThenElse( + Expression.TypeIs(valueExp, typeof(string)), + Expression.Return(returnTarget, + Expression.TypeAs( + Expression.Call(MethodJArrayParse, + Expression.Convert(valueExp, typeof(string))), typeof(JArray))), + Expression.Return(returnTarget, + Expression.TypeAs(Expression.Call(MethodJArrayFromObject, valueExp), + typeof(JArray)))); + case "Npgsql.LegacyPostgis.PostgisGeometry": + return Expression.Return(returnTarget, valueExp); + case "NetTopologySuite.Geometries.Geometry": + return Expression.Return(returnTarget, valueExp); + } + + if (typeof(IList).IsAssignableFrom(type)) + return Expression.IfThenElse( + Expression.TypeIs(valueExp, typeof(string)), + Expression.Return(returnTarget, + Expression.TypeAs( + Expression.Call(MethodJsonConvertDeserializeObject, + Expression.Convert(valueExp, typeof(string)), + Expression.Constant(type, typeof(Type))), type)), + Expression.Return(returnTarget, + Expression.TypeAs( + Expression.Call(MethodJsonConvertDeserializeObject, + Expression.Convert(Expression.Call(MethodToString, valueExp), typeof(string)), + Expression.Constant(type, typeof(Type))), type))); + return null; + }); + + Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = + typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); + + QuestDbContainer.Initialize(service => + { + service.AddHttpClient(); + }); + } } public override ISelect CreateSelectProvider(object dywhere) => @@ -139,6 +143,7 @@ namespace FreeSql.QuestDb public QuestDbProvider(string masterConnectionString, string[] slaveConnectionString, Func connectionFactory = null) { + InitInternal(); this.InternalCommonUtils = new QuestDbUtils(this); this.InternalCommonExpression = new QuestDbExpression(this.InternalCommonUtils); diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs index bb26187b..fdb7635f 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs @@ -9,9 +9,13 @@ namespace FreeSql.SqlServer public class SqlServerProvider : BaseDbProvider, IFreeSql { - static SqlServerProvider() + static int _firstInit = 1; + static void InitInternal() { - Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); + if (Interlocked.Exchange(ref _firstInit, 0) == 1) //不能放在 static ctor .NetFramework 可能报初始化类型错误 + { + Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); + } } public override ISelect CreateSelectProvider(object dywhere) => new SqlServerSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); @@ -22,6 +26,7 @@ namespace FreeSql.SqlServer public SqlServerProvider(string masterConnectionString, string[] slaveConnectionString, Func connectionFactory = null) { + InitInternal(); this.InternalCommonUtils = new SqlServerUtils(this); this.InternalCommonExpression = new SqlServerExpression(this.InternalCommonUtils); diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs b/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs index b28631fc..ad936938 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs @@ -9,9 +9,13 @@ namespace FreeSql.Sqlite public class SqliteProvider : BaseDbProvider, IFreeSql { - static SqliteProvider() + static int _firstInit = 1; + static void InitInternal() { - Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); + if (Interlocked.Exchange(ref _firstInit, 0) == 1) //不能放在 static ctor .NetFramework 可能报初始化类型错误 + { + Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); + } } public override ISelect CreateSelectProvider(object dywhere) => new SqliteSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); @@ -22,6 +26,7 @@ namespace FreeSql.Sqlite public SqliteProvider(string masterConnectionString, string[] slaveConnectionString, Func connectionFactory = null) { + InitInternal(); this.InternalCommonUtils = new SqliteUtils(this); this.InternalCommonExpression = new SqliteExpression(this.InternalCommonUtils); diff --git a/Providers/FreeSql.Provider.Xugu/XuguProvider.cs b/Providers/FreeSql.Provider.Xugu/XuguProvider.cs index 92122c19..4093f58c 100644 --- a/Providers/FreeSql.Provider.Xugu/XuguProvider.cs +++ b/Providers/FreeSql.Provider.Xugu/XuguProvider.cs @@ -16,82 +16,86 @@ namespace FreeSql.Xugu public class XuguProvider : BaseDbProvider, IFreeSql { - static XuguProvider() + static int _firstInit = 1; + static void InitInternal() { - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BigInteger)] = true; - Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BitArray)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPoint)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlLine)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlLSeg)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlBox)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPath)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPolygon)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlCircle)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof((IPAddress Address, int Subnet))] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(IPAddress)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PhysicalAddress)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; - - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisPoint)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisLineString)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisPolygon)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisMultiPoint)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisMultiLineString)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisMultiPolygon)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisGeometry)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisGeometryCollection)] = true; - - - - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(Dictionary)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JToken)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JObject)] = true; - //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JArray)] = true; - - var MethodJTokenFromObject = typeof(JToken).GetMethod("FromObject", new[] { typeof(object) }); - var MethodJObjectFromObject = typeof(JObject).GetMethod("FromObject", new[] { typeof(object) }); - var MethodJArrayFromObject = typeof(JArray).GetMethod("FromObject", new[] { typeof(object) }); - var MethodJTokenParse = typeof(JToken).GetMethod("Parse", new[] { typeof(string) }); - var MethodJObjectParse = typeof(JObject).GetMethod("Parse", new[] { typeof(string) }); - var MethodJArrayParse = typeof(JArray).GetMethod("Parse", new[] { typeof(string) }); - var MethodJsonConvertDeserializeObject = typeof(JsonConvert).GetMethod("DeserializeObject", new[] { typeof(string), typeof(Type) }); - var MethodToString = typeof(Utils).GetMethod("ToStringConcat", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(object) }, null); - Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, Type type) => + if (Interlocked.Exchange(ref _firstInit, 0) == 1) //不能放在 static ctor .NetFramework 可能报初始化类型错误 { - switch (type.FullName) + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BigInteger)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BitArray)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPoint)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlLine)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlLSeg)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlBox)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPath)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlPolygon)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlCircle)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof((IPAddress Address, int Subnet))] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(IPAddress)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PhysicalAddress)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(NpgsqlRange)] = true; + + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisPoint)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisLineString)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisPolygon)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisMultiPoint)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisMultiLineString)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisMultiPolygon)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisGeometry)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(PostgisGeometryCollection)] = true; + + + + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(Dictionary)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JToken)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JObject)] = true; + //Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JArray)] = true; + + var MethodJTokenFromObject = typeof(JToken).GetMethod("FromObject", new[] { typeof(object) }); + var MethodJObjectFromObject = typeof(JObject).GetMethod("FromObject", new[] { typeof(object) }); + var MethodJArrayFromObject = typeof(JArray).GetMethod("FromObject", new[] { typeof(object) }); + var MethodJTokenParse = typeof(JToken).GetMethod("Parse", new[] { typeof(string) }); + var MethodJObjectParse = typeof(JObject).GetMethod("Parse", new[] { typeof(string) }); + var MethodJArrayParse = typeof(JArray).GetMethod("Parse", new[] { typeof(string) }); + var MethodJsonConvertDeserializeObject = typeof(JsonConvert).GetMethod("DeserializeObject", new[] { typeof(string), typeof(Type) }); + var MethodToString = typeof(Utils).GetMethod("ToStringConcat", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(object) }, null); + Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, Type type) => { - case "Newtonsoft.Json.Linq.JToken": + switch (type.FullName) + { + case "Newtonsoft.Json.Linq.JToken": + return Expression.IfThenElse( + Expression.TypeIs(valueExp, typeof(string)), + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJTokenParse, Expression.Convert(valueExp, typeof(string))), typeof(JToken))), + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJTokenFromObject, valueExp), typeof(JToken)))); + case "Newtonsoft.Json.Linq.JObject": + return Expression.IfThenElse( + Expression.TypeIs(valueExp, typeof(string)), + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJObjectParse, Expression.Convert(valueExp, typeof(string))), typeof(JObject))), + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJObjectFromObject, valueExp), typeof(JObject)))); + case "Newtonsoft.Json.Linq.JArray": + return Expression.IfThenElse( + Expression.TypeIs(valueExp, typeof(string)), + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJArrayParse, Expression.Convert(valueExp, typeof(string))), typeof(JArray))), + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJArrayFromObject, valueExp), typeof(JArray)))); + //case "Npgsql.LegacyPostgis.PostgisGeometry": + // return Expression.Return(returnTarget, valueExp); + //case "NetTopologySuite.Geometries.Geometry": + // return Expression.Return(returnTarget, valueExp); + } + if (typeof(IList).IsAssignableFrom(type)) return Expression.IfThenElse( Expression.TypeIs(valueExp, typeof(string)), - Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJTokenParse, Expression.Convert(valueExp, typeof(string))), typeof(JToken))), - Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJTokenFromObject, valueExp), typeof(JToken)))); - case "Newtonsoft.Json.Linq.JObject": - return Expression.IfThenElse( - Expression.TypeIs(valueExp, typeof(string)), - Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJObjectParse, Expression.Convert(valueExp, typeof(string))), typeof(JObject))), - Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJObjectFromObject, valueExp), typeof(JObject)))); - case "Newtonsoft.Json.Linq.JArray": - return Expression.IfThenElse( - Expression.TypeIs(valueExp, typeof(string)), - Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJArrayParse, Expression.Convert(valueExp, typeof(string))), typeof(JArray))), - Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJArrayFromObject, valueExp), typeof(JArray)))); - //case "Npgsql.LegacyPostgis.PostgisGeometry": - // return Expression.Return(returnTarget, valueExp); - //case "NetTopologySuite.Geometries.Geometry": - // return Expression.Return(returnTarget, valueExp); - } - if (typeof(IList).IsAssignableFrom(type)) - return Expression.IfThenElse( - Expression.TypeIs(valueExp, typeof(string)), - Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJsonConvertDeserializeObject, Expression.Convert(valueExp, typeof(string)), Expression.Constant(type, typeof(Type))), type)), - Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJsonConvertDeserializeObject, Expression.Convert(Expression.Call(MethodToString, valueExp), typeof(string)), Expression.Constant(type, typeof(Type))), type))); - return null; - }); - - Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJsonConvertDeserializeObject, Expression.Convert(valueExp, typeof(string)), Expression.Constant(type, typeof(Type))), type)), + Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJsonConvertDeserializeObject, Expression.Convert(Expression.Call(MethodToString, valueExp), typeof(string)), Expression.Constant(type, typeof(Type))), type))); + return null; + }); + + Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); + } } public override ISelect CreateSelectProvider(object dywhere) => new XuguSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); @@ -102,6 +106,7 @@ namespace FreeSql.Xugu public XuguProvider(string masterConnectionString, string[] slaveConnectionString, Func connectionFactory = null) { + InitInternal(); this.InternalCommonUtils = new XuguUtils(this); this.InternalCommonExpression = new XuguExpression(this.InternalCommonUtils); From 1424649bc365bd8933a4dd04ee0eb5125ff31602 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Sat, 20 May 2023 17:12:58 +0800 Subject: [PATCH 47/58] v3.2.696-preview20230520 --- Directory.Build.props | 2 +- .../FreeSql.Extensions.AggregateRoot.csproj | 2 +- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- .../FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj | 2 +- Extensions/FreeSql.Generator/FreeSql.Generator.csproj | 2 +- FreeSql.All/FreeSql.All.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.Repository/FreeSql.Repository.csproj | 2 +- FreeSql/FreeSql.csproj | 2 +- .../FreeSql.Provider.ClickHouse.csproj | 2 +- .../FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj | 2 +- .../FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj | 2 +- .../FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj | 2 +- Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj | 2 +- .../FreeSql.Provider.KingbaseES.csproj | 2 +- .../FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj | 2 +- Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.OracleOledb.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj | 2 +- .../FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- .../FreeSql.Provider.SqlServerForSystem.csproj | 2 +- .../FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj | 2 +- .../FreeSql.Provider.SqliteCore.csproj | 2 +- Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj | 2 +- 31 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index ca86c52d..1a183c9a 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index 60e72b33..620f3ad6 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index c9d443f3..a90b53d2 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index cfbd14a6..96e496b0 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index cbb2deb7..4fad109f 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index 7b01e022..97d83dbf 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 2ed1ffba..083dc79a 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index 883fc61c..e03419ce 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index a9e30414..388d05c8 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 7c7f02db..0ba3b70f 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index eb9c4197..ded0c7de 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index d04daed3..b78ec37b 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index eceb77e0..10690ada 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index c5f6fe7b..1595c754 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index bfe53aff..0f35637a 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 564fb5d5..5a4a2980 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index b87a5bd5..790702de 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index 2d267248..03708221 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index d0984932..01c923d2 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 7af11820..36b3608f 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index a23839fd..d3897157 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 74528c22..7a38c454 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index 0f341ea3..edb14352 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index ba4a99a5..f1704282 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index a3a2b6e2..2293bfc8 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index 00fece90..33d036dd 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index ed611701..221fdf40 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index a1812564..4007781e 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index ca28cb21..7b551796 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index c008b061..71bb269e 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230518 + 3.2.696-preview20230520 diff --git a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj index b3d30118..b927e7c3 100644 --- a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj +++ b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230518 + 3.2.696-preview20230520 From 98c4ce8274e4f3a2fd6daebfd1847d1f205fd8fd Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 23 May 2023 12:09:19 +0800 Subject: [PATCH 48/58] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20WithTempQuery=20?= =?UTF-8?q?+=20Oracle=20=E5=88=86=E9=A1=B5=E9=97=AE=E9=A2=98=EF=BC=9B#1519?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Curd/SqlServerSelectWithTempQueryTest.cs | 38 ++++++++ FreeSql.Tests/tests.playlist | 88 +++++++++++++++++++ .../FreeSqlGlobalExpressionCallExtensions.cs | 11 +++ FreeSql/FreeSql.xml | 8 ++ .../Oracle/Curd/CustomOracleSelect.cs | 10 ++- .../SqlServer/Curd/CustomSqlServerSelect.cs | 9 +- .../Curd/DamengSelect.cs | 9 +- .../Dameng/Curd/OdbcDamengSelect.cs | 9 +- .../Oracle/Curd/OdbcOracleSelect.cs | 9 +- .../SqlServer/Curd/OdbcSqlServerSelect.cs | 9 +- .../Curd/OracleSelect.cs | 10 ++- .../Curd/SqlServerSelect.cs | 9 +- 12 files changed, 195 insertions(+), 24 deletions(-) create mode 100644 FreeSql.Tests/tests.playlist diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs index bbf089be..5b9fb9dc 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs @@ -9,6 +9,44 @@ namespace FreeSql.Tests.SqlServer { public class SqlServerSelectWithTempQueryTest { + [Fact] + public void Issues1519() + { + var fsql = g.oracle; + + var query = fsql.Select() + .FromQuery(fsql.Select().WithTempQuery(e => e)) + .InnerJoin(t => t.t1.Id == t.t2.T1JoinId) + .WithTempQuery(t => new + { + t.t1.Id, + t.t1.Name, + T2Id = t.t2.Id, + T2Name = t.t1.Name, + }); + var sql = query.ToSql(); + Assert.Equal(sql, @"SELECT * +FROM ( + SELECT a.""ID"", a.""NAME"", htb.""ID"" ""T2ID"", a.""NAME"" ""T2NAME"" + FROM ""ISSUES1510T1"" a + INNER JOIN ( + SELECT a.""ID"", a.""NAME"", a.""T1JOINID"" + FROM ""ISSUES1510T2"" a ) htb ON a.""ID"" = htb.""T1JOINID"" ) a"); + query.ToList(); + + query.Page(2, 5); + sql = query.ToSql(); + Assert.Equal(sql, @"SELECT t.* FROM (SELECT a.*, ROWNUM AS ""__rownum__"" +FROM ( + SELECT a.""ID"", a.""NAME"", htb.""ID"" ""T2ID"", a.""NAME"" ""T2NAME"" + FROM ""ISSUES1510T1"" a + INNER JOIN ( + SELECT a.""ID"", a.""NAME"", a.""T1JOINID"" + FROM ""ISSUES1510T2"" a ) htb ON a.""ID"" = htb.""T1JOINID"" ) a +WHERE ROWNUM < 11) t WHERE t.""__rownum__"" > 5"); + query.ToList(); + } + [Fact] public void Issues1510() { diff --git a/FreeSql.Tests/tests.playlist b/FreeSql.Tests/tests.playlist new file mode 100644 index 00000000..a7cc0cc4 --- /dev/null +++ b/FreeSql.Tests/tests.playlist @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FreeSql/Extensions/FreeSqlGlobalExpressionCallExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExpressionCallExtensions.cs index e9b1a489..5fbbf47b 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExpressionCallExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExpressionCallExtensions.cs @@ -188,6 +188,17 @@ namespace FreeSql expContext.Value.Result = $"{expContext.Value.ParsedContent["value1"]} <= {expContext.Value.ParsedContent["value2"]}"; return false; } + /// + /// value1 IS NULL + /// + /// + /// + /// + public static bool EqualIsNull(TValue value1) + { + expContext.Value.Result = $"{expContext.Value.ParsedContent["value1"]} IS NULL"; + return false; + } #endregion /// diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 8cd7ad2d..9f25ee32 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1377,6 +1377,14 @@ + + + value1 IS NULL + + + + + case when .. then .. end diff --git a/Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleSelect.cs b/Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleSelect.cs index 0b51424f..3fbf9b58 100644 --- a/Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleSelect.cs +++ b/Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleSelect.cs @@ -32,11 +32,15 @@ namespace FreeSql.Custom.Oracle sbunion.Append(_select); if (_distinct) sbunion.Append("DISTINCT "); - sbunion.Append(field); - if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\""); - sbunion.Append(" \r\nFROM "); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); + + var isRownum = string.IsNullOrEmpty(_orderby) && _skip > 0; + if (isRownum && field == "*") sbunion.Append(tbsfrom[0].Alias).Append("."); //#1519 bug + sbunion.Append(field); + if (isRownum) sbunion.Append(", ROWNUM AS \"__rownum__\""); + sbunion.Append(" \r\nFROM "); + for (var a = 0; a < tbsfrom.Length; a++) { sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); diff --git a/Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerSelect.cs b/Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerSelect.cs index 9d07dd2d..6aa9cbb1 100644 --- a/Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerSelect.cs +++ b/Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerSelect.cs @@ -41,7 +41,7 @@ namespace FreeSql.Custom.SqlServer if (_distinct) sb.Append("DISTINCT "); //if (_limit > 0) sb.Append("TOP ").Append(_skip + _limit).Append(" "); //TOP 会引发 __rownum__ 无序的问题 if (_skip <= 0 && _limit > 0) sb.Append("TOP ").Append(_limit).Append(" "); - sb.Append(field); + var rownum = ""; if (_limit > 0 || _skip > 0) { @@ -57,11 +57,14 @@ namespace FreeSql.Custom.SqlServer _orderby = _groupby.Replace("GROUP BY ", "ORDER BY "); } if (_skip > 0) // 注意这个判断,大于 0 才使用 ROW_NUMBER ,否则属于第一页直接使用 TOP - sb.Append(", ROW_NUMBER() OVER(").Append(_orderby.Trim('\r', '\n', ' ')).Append(") AS __rownum__"); + rownum = $", ROW_NUMBER() OVER({_orderby.Trim('\r', '\n', ' ')}) AS __rownum__"; } - sb.Append(" \r\nFROM "); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); + if (string.IsNullOrEmpty(rownum) == false && field == "*") + sb.Append(tbsfrom[0].Alias).Append("."); //#1519 bug + sb.Append(field).Append(rownum); + sb.Append(" \r\nFROM "); for (var a = 0; a < tbsfrom.Length; a++) { var alias = LocalGetTableAlias(tbsfrom[a].Table.Type, tbUnion[tbsfrom[a].Table.Type], tbsfrom[a].Alias, _aliasRule); diff --git a/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs b/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs index 29d769ab..344f2c41 100644 --- a/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs +++ b/Providers/FreeSql.Provider.Dameng/Curd/DamengSelect.cs @@ -32,11 +32,14 @@ namespace FreeSql.Dameng.Curd sbunion.Append(_select); if (_distinct) sbunion.Append("DISTINCT "); - sbunion.Append(field); - if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\""); - sbunion.Append(" \r\nFROM "); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); + + var isRownum = string.IsNullOrEmpty(_orderby) && _skip > 0; + if (isRownum && field == "*") sbunion.Append(tbsfrom[0].Alias).Append("."); //#1519 bug + sbunion.Append(field); + if (isRownum) sbunion.Append(", ROWNUM AS \"__rownum__\""); + sbunion.Append(" \r\nFROM "); for (var a = 0; a < tbsfrom.Length; a++) { sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs index 7066b98b..a56c5cd5 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengSelect.cs @@ -32,11 +32,14 @@ namespace FreeSql.Odbc.Dameng sbunion.Append(_select); if (_distinct) sbunion.Append("DISTINCT "); - sbunion.Append(field); - if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\""); - sbunion.Append(" \r\nFROM "); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); + + var isRownum = string.IsNullOrEmpty(_orderby) && _skip > 0; + if (isRownum && field == "*") sbunion.Append(tbsfrom[0].Alias).Append("."); //#1519 bug + sbunion.Append(field); + if (isRownum) sbunion.Append(", ROWNUM AS \"__rownum__\""); + sbunion.Append(" \r\nFROM "); for (var a = 0; a < tbsfrom.Length; a++) { sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs index 54dd773c..898f0c53 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleSelect.cs @@ -32,11 +32,14 @@ namespace FreeSql.Odbc.Oracle sbunion.Append(_select); if (_distinct) sbunion.Append("DISTINCT "); - sbunion.Append(field); - if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\""); - sbunion.Append(" \r\nFROM "); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); + + var isRownum = string.IsNullOrEmpty(_orderby) && _skip > 0; + if (isRownum && field == "*") sbunion.Append(tbsfrom[0].Alias).Append("."); //#1519 bug + sbunion.Append(field); + if (isRownum) sbunion.Append(", ROWNUM AS \"__rownum__\""); + sbunion.Append(" \r\nFROM "); for (var a = 0; a < tbsfrom.Length; a++) { sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs index 1e3bfdce..03a2b81c 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerSelect.cs @@ -41,7 +41,7 @@ namespace FreeSql.Odbc.SqlServer if (_distinct) sb.Append("DISTINCT "); //if (_limit > 0) sb.Append("TOP ").Append(_skip + _limit).Append(" "); //TOP 会引发 __rownum__ 无序的问题 if (_skip <= 0 && _limit > 0) sb.Append("TOP ").Append(_limit).Append(" "); - sb.Append(field); + var rownum = ""; if (_limit > 0 || _skip > 0) { @@ -57,11 +57,14 @@ namespace FreeSql.Odbc.SqlServer _orderby = _groupby.Replace("GROUP BY ", "ORDER BY "); } if (_skip > 0) // 注意这个判断,大于 0 才使用 ROW_NUMBER ,否则属于第一页直接使用 TOP - sb.Append(", ROW_NUMBER() OVER(").Append(_orderby.Trim('\r', '\n', ' ')).Append(") AS __rownum__"); + rownum = $", ROW_NUMBER() OVER({_orderby.Trim('\r', '\n', ' ')}) AS __rownum__"; } - sb.Append(" \r\nFROM "); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); + if (string.IsNullOrEmpty(rownum) == false && field == "*") + sb.Append(tbsfrom[0].Alias).Append("."); //#1519 bug + sb.Append(field).Append(rownum); + sb.Append(" \r\nFROM "); for (var a = 0; a < tbsfrom.Length; a++) { var alias = LocalGetTableAlias(tbsfrom[a].Table.Type, tbUnion[tbsfrom[a].Table.Type], tbsfrom[a].Alias, _aliasRule); diff --git a/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs index 636d961b..f4db61dd 100644 --- a/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs +++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs @@ -32,11 +32,15 @@ namespace FreeSql.Oracle.Curd sbunion.Append(_select); if (_distinct) sbunion.Append("DISTINCT "); - sbunion.Append(field); - if (string.IsNullOrEmpty(_orderby) && _skip > 0) sbunion.Append(", ROWNUM AS \"__rownum__\""); - sbunion.Append(" \r\nFROM "); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); + + var isRownum = string.IsNullOrEmpty(_orderby) && _skip > 0; + if (isRownum && field == "*") sbunion.Append(tbsfrom[0].Alias).Append("."); //#1519 bug + sbunion.Append(field); + if (isRownum) sbunion.Append(", ROWNUM AS \"__rownum__\""); + sbunion.Append(" \r\nFROM "); + for (var a = 0; a < tbsfrom.Length; a++) { sbunion.Append(_commonUtils.QuoteSqlName(tbUnion[tbsfrom[a].Table.Type])).Append(" ").Append(_aliasRule?.Invoke(tbsfrom[a].Table.Type, tbsfrom[a].Alias) ?? tbsfrom[a].Alias); diff --git a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs index ac66d414..b19c51de 100644 --- a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs +++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs @@ -41,7 +41,7 @@ namespace FreeSql.SqlServer.Curd if (_distinct) sb.Append("DISTINCT "); //if (_limit > 0) sb.Append("TOP ").Append(_skip + _limit).Append(" "); //TOP 会引发 __rownum__ 无序的问题 if (_skip <= 0 && _limit > 0) sb.Append("TOP ").Append(_limit).Append(" "); - sb.Append(field); + var rownum = ""; if (_limit > 0 || _skip > 0) { @@ -57,11 +57,14 @@ namespace FreeSql.SqlServer.Curd _orderby = _groupby.Replace("GROUP BY ", "ORDER BY "); } if (_skip > 0) // 注意这个判断,大于 0 才使用 ROW_NUMBER ,否则属于第一页直接使用 TOP - sb.Append(", ROW_NUMBER() OVER(").Append(_orderby.Trim('\r', '\n', ' ')).Append(") AS __rownum__"); + rownum = $", ROW_NUMBER() OVER({_orderby.Trim('\r', '\n', ' ')}) AS __rownum__"; } - sb.Append(" \r\nFROM "); var tbsjoin = _tables.Where(a => a.Type != SelectTableInfoType.From).ToArray(); var tbsfrom = _tables.Where(a => a.Type == SelectTableInfoType.From).ToArray(); + if (string.IsNullOrEmpty(rownum) == false && field == "*") + sb.Append(tbsfrom[0].Alias).Append("."); //#1519 bug + sb.Append(field).Append(rownum); + sb.Append(" \r\nFROM "); for (var a = 0; a < tbsfrom.Length; a++) { var alias = LocalGetTableAlias(tbsfrom[a].Table.Type, tbUnion[tbsfrom[a].Table.Type], tbsfrom[a].Alias, _aliasRule); From 6fedb20673d8afaa2edcdaaff9635ebfd087c314 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 23 May 2023 12:13:36 +0800 Subject: [PATCH 49/58] v3.2.696-preview20230523 #1519 --- Directory.Build.props | 2 +- .../FreeSql.Extensions.AggregateRoot.csproj | 2 +- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- .../FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj | 2 +- Extensions/FreeSql.Generator/FreeSql.Generator.csproj | 2 +- FreeSql.All/FreeSql.All.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.Repository/FreeSql.Repository.csproj | 2 +- FreeSql/FreeSql.csproj | 2 +- .../FreeSql.Provider.ClickHouse.csproj | 2 +- .../FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj | 2 +- .../FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj | 2 +- .../FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj | 2 +- Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj | 2 +- .../FreeSql.Provider.KingbaseES.csproj | 2 +- .../FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj | 2 +- Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.OracleOledb.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj | 2 +- .../FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- .../FreeSql.Provider.SqlServerForSystem.csproj | 2 +- .../FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj | 2 +- .../FreeSql.Provider.SqliteCore.csproj | 2 +- Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj | 2 +- 31 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 1a183c9a..4eeeb41b 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index 620f3ad6..ac551f55 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index a90b53d2..042764bb 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index 96e496b0..21611588 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index 4fad109f..c99024f3 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index 97d83dbf..96dd5559 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 083dc79a..05d9990b 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index e03419ce..5666aee4 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 388d05c8..2d3343a4 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 0ba3b70f..43dfdc4c 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index ded0c7de..d73f2f8a 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index b78ec37b..ec418024 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index 10690ada..72566b84 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index 1595c754..a666a353 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index 0f35637a..4b10b4d1 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 5a4a2980..e06c6790 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index 790702de..9b8bc1de 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index 03708221..6d297261 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 01c923d2..5b416c17 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 36b3608f..0c9474e3 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index d3897157..a8e18813 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 7a38c454..7a15130c 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index edb14352..8f72b2d7 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index f1704282..d883bb8f 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index 2293bfc8..4859f2ad 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index 33d036dd..44be9479 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index 221fdf40..7c73a3df 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index 4007781e..e6f3023e 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index 7b551796..57d66524 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index 71bb269e..78e91ac3 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230520 + 3.2.696-preview20230523 diff --git a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj index b927e7c3..f61f0df7 100644 --- a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj +++ b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230520 + 3.2.696-preview20230523 From 6b84bd79ae4ea867ddd95f48b67c38eaea1e194d Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 23 May 2023 22:25:14 +0800 Subject: [PATCH 50/58] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20=20+=20A?= =?UTF-8?q?sType=20+=20(a=20as=20BaseEntity)=20=E8=A7=A3=E6=9E=90=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=9B#1427?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 9 -------- .../SqlServer/Curd/SqlServerDeleteTest.cs | 21 ++++++++++++++++++- FreeSql/Internal/CommonExpression.cs | 2 +- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 26522f10..537315e2 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -800,14 +800,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerDeleteTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerDeleteTest.cs index d36d73e2..80a278da 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerDeleteTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerDeleteTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using FreeSql.Tests.DataContext.SqlServer; using System; using System.Collections.Generic; @@ -30,6 +30,25 @@ namespace FreeSql.Tests.SqlServer public DateTime CreateTime { get; set; } } + abstract class EntityBase + { + public int Id { get; set; } + } + class SysDictionnary : EntityBase + { + public string Name { get; set; } + } + [Fact] + public void AsType() + { + var fsql = g.sqlserver; + + var delsid = new[] { 1, 2, 3, 4 }; + var sqlsss22222 = fsql.Delete().AsType(typeof(SysDictionnary)) + .Where(o => delsid.Contains((o as EntityBase).Id)) + .ToSql(); + } + [Fact] public void Dywhere() { diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index e2795d65..3e73ea95 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -1748,7 +1748,7 @@ namespace FreeSql.Internal if (oper2.NodeType == ExpressionType.Parameter) { var oper2Parm = oper2 as ParameterExpression; - if (exp2.Type.IsAbstract || exp2.Type.IsInterface || exp2.Type.IsAssignableFrom(oper2Parm.Type)) + if (oper2Parm.Type != typeof(object) && (exp2.Type.IsAbstract || exp2.Type.IsInterface || exp2.Type.IsAssignableFrom(oper2Parm.Type))) expStack.Push(oper2Parm); else if (oper2Parm.Type != typeof(object) && oper2Parm.Type.IsAssignableFrom(exp2.Type)) expStack.Push(oper2Parm); From 496a9697429af22b69b5b80050c442c895f997e8 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 23 May 2023 22:28:19 +0800 Subject: [PATCH 51/58] v3.2.696-preview20230524 #1427 #1521 --- Directory.Build.props | 2 +- .../FreeSql.Extensions.AggregateRoot.csproj | 2 +- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- .../FreeSql.Extensions.Linq.csproj | 2 +- .../FreeSql.Generator.csproj | 2 +- FreeSql.All/FreeSql.All.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.xml | 9 ++ FreeSql.Repository/FreeSql.Repository.csproj | 2 +- FreeSql/FreeSql.csproj | 2 +- FreeSql/FreeSql.xml | 98 ------------------- .../FreeSql.Provider.ClickHouse.csproj | 2 +- .../FreeSql.Provider.Custom.csproj | 2 +- .../FreeSql.Provider.Dameng.csproj | 2 +- .../FreeSql.Provider.Firebird.csproj | 2 +- .../FreeSql.Provider.GBase.csproj | 2 +- .../FreeSql.Provider.KingbaseES.csproj | 2 +- .../FreeSql.Provider.MsAccess.csproj | 2 +- .../FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- .../FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.OracleOledb.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.QuestDb.csproj | 2 +- .../FreeSql.Provider.ShenTong.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- ...FreeSql.Provider.SqlServerForSystem.csproj | 2 +- .../FreeSql.Provider.Sqlite.csproj | 2 +- .../FreeSql.Provider.SqliteCore.csproj | 2 +- .../FreeSql.Provider.Xugu.csproj | 2 +- 33 files changed, 40 insertions(+), 129 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 4eeeb41b..50c04bab 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index ac551f55..1e77ee8d 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index 042764bb..f86b9c3d 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index 21611588..75a81132 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index c99024f3..b011d20d 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index 96dd5559..d771e6ac 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 05d9990b..010e3abd 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index 5666aee4..a667484b 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 2d3343a4..4f2e91ba 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 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.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 43dfdc4c..1cc27529 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index d73f2f8a..438f17f3 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 9f25ee32..807dc336 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1073,82 +1073,6 @@ - - - 动态创建实体类型 - - - - - 配置Class - - 类名 - 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] - - - - - 配置属性 - - 属性名称 - 属性类型 - 属性标记的特性-支持多个 - - - - - 配置属性 - - 属性名称 - 属性类型 - 该属性是否重写父类属性 - 属性标记的特性-支持多个 - - - - - 配置属性 - - 属性名称 - 属性类型 - 该属性是否重写父类属性 - 属性默认值 - 属性标记的特性-支持多个 - - - - - 配置父类 - - 父类类型 - - - - - Override属性 - - - - - - Emit动态创建出Class - Type - - - - - - 首字母小写 - - - - - - - 首字母大写 - - - - 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -5776,28 +5700,6 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 - - - 动态构建Class Type - - - - - - 根据字典,创建 table 对应的实体对象 - - - - - - - - 根据实体对象,创建 table 对应的字典 - - - - - C#: that >= between && that <= and diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index ec418024..954c3476 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index 72566b84..199121d6 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index a666a353..e8a9f1dc 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index 4b10b4d1..e3c952c0 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index e06c6790..795b3366 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index 9b8bc1de..93ac58c0 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index 6d297261..33fb591b 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 5b416c17..efb7e12c 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 0c9474e3..793d1ebd 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index a8e18813..f1cdd696 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 7a15130c..8669accb 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index 8f72b2d7..a357ebc7 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index d883bb8f..798fb767 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index 4859f2ad..c65227c2 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index 44be9479..d889009a 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index 7c73a3df..eafb875c 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index e6f3023e..1c10dc39 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index 57d66524..a28a13ea 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index 78e91ac3..fd29fe59 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230523 + 3.2.696-preview20230524 diff --git a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj index f61f0df7..0b7258e0 100644 --- a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj +++ b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230523 + 3.2.696-preview20230524 From 1250f4f3af0f515a64c7da5a2886c4ce42381762 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 24 May 2023 13:04:34 +0800 Subject: [PATCH 52/58] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20IUpdate=20?= =?UTF-8?q?=E6=89=B9=E9=87=8F=20case=20when=20=E5=90=8C=E5=80=BC=E7=9A=84?= =?UTF-8?q?=20SQL=20=E7=94=9F=E6=88=90=EF=BC=9B#1393?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/FreeSql.xml | 98 +++++++++++++++++++ .../Internal/CommonProvider/UpdateProvider.cs | 77 ++++++++------- 2 files changed, 142 insertions(+), 33 deletions(-) diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 807dc336..9f25ee32 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1073,6 +1073,82 @@ + + + 动态创建实体类型 + + + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性默认值 + 属性标记的特性-支持多个 + + + + + 配置父类 + + 父类类型 + + + + + Override属性 + + + + + + Emit动态创建出Class - Type + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -5700,6 +5776,28 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 + + + 动态构建Class Type + + + + + + 根据字典,创建 table 对应的实体对象 + + + + + + + + 根据实体对象,创建 table 对应的字典 + + + + + C#: that >= between && that <= and diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 4593f830..02a8c04d 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -894,28 +894,30 @@ namespace FreeSql.Internal.CommonProvider var sb = new StringBuilder(); sb.Append(_commonUtils.QuoteSqlName(col.Attribute.Name)).Append(" = "); - string valsqlOld = null; - var valsqlOldStats = 1; //start 1 - var nullStats = 0; - var cwsb = new StringBuilder().Append(cw); - foreach (var d in _source) + var valsameIf = col.Attribute.MapType.IsNumberType() || col.Attribute.MapType == typeof(string) || col.Attribute.MapType.NullableTypeOrThis().IsEnum; + var ds = _source.Select(a => col.GetDbValue(a)).ToArray(); + if (valsameIf && ds.All(a => object.Equals(a, ds[0]))) { - cwsb.Append(" \r\nWHEN "); - ToSqlWhen(cwsb, _tempPrimarys, d); - cwsb.Append(" THEN "); - var val = col.GetDbValue(d); - var valsql = thenValue(_commonUtils.RewriteColumn(col, _commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col, col.Attribute.MapType, val))); - cwsb.Append(valsql); - if (valsqlOld == null) valsqlOld = valsql; - else if (valsqlOld == valsql) valsqlOldStats++; - if (val == null || val == DBNull.Value) nullStats++; + var val = ds.First(); + var colsql = thenValue(_commonUtils.RewriteColumn(col, _commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col, col.Attribute.MapType, val))); + sb.Append(colsql); + } + else + { + var cwsb = new StringBuilder().Append(cw); + foreach (var d in _source) + { + cwsb.Append(" \r\nWHEN "); + ToSqlWhen(cwsb, _tempPrimarys, d); + cwsb.Append(" THEN "); + var val = col.GetDbValue(d); + var colsql = thenValue(_commonUtils.RewriteColumn(col, _commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col, col.Attribute.MapType, val))); + cwsb.Append(colsql); + } + cwsb.Append(" END"); + sb.Append(cwsb); + cwsb.Clear(); } - cwsb.Append(" END"); - if (nullStats == _source.Count) sb.Append("NULL"); - else if (valsqlOldStats == _source.Count) sb.Append(valsqlOld); - else sb.Append(cwsb); - cwsb.Clear(); - return sb.ToString(); } } @@ -1147,30 +1149,39 @@ namespace FreeSql.Internal.CommonProvider sb.Append(col.DbUpdateValue); else { - var nulls = 0; - var cwsb = new StringBuilder().Append(cw); - foreach (var d in _source) + var valsameIf = col.Attribute.MapType.IsNumberType() || col.Attribute.MapType == typeof(string) || col.Attribute.MapType.NullableTypeOrThis().IsEnum; + var ds = _source.Select(a => col.GetDbValue(a)).ToArray(); + if (valsameIf && ds.All(a => object.Equals(a, ds[0]))) { - cwsb.Append(" \r\nWHEN "); - ToSqlWhen(cwsb, _tempPrimarys, d); - cwsb.Append(" THEN "); - var val = col.GetDbValue(d); - + var val = ds.First(); var colsql = _noneParameter ? _commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col, col.Attribute.MapType, val) : _commonUtils.QuoteWriteParamterAdapter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"p_{_paramsSource.Count}")); - cwsb.Append(_commonUtils.RewriteColumn(col, colsql)); + sb.Append(_commonUtils.RewriteColumn(col, colsql)); if (_noneParameter == false) _commonUtils.AppendParamter(_paramsSource, null, col, col.Attribute.MapType, val); - if (val == null || val == DBNull.Value) nulls++; } - cwsb.Append(" END"); - if (nulls == _source.Count) sb.Append("NULL"); else { + var cwsb = new StringBuilder().Append(cw); + foreach (var d in _source) + { + cwsb.Append(" \r\nWHEN "); + ToSqlWhen(cwsb, _tempPrimarys, d); + cwsb.Append(" THEN "); + var val = col.GetDbValue(d); + + var colsql = _noneParameter ? _commonUtils.GetNoneParamaterSqlValue(_paramsSource, "u", col, col.Attribute.MapType, val) : + _commonUtils.QuoteWriteParamterAdapter(col.Attribute.MapType, _commonUtils.QuoteParamterName($"p_{_paramsSource.Count}")); + colsql = _commonUtils.RewriteColumn(col, colsql); + cwsb.Append(colsql); + if (_noneParameter == false) + _commonUtils.AppendParamter(_paramsSource, null, col, col.Attribute.MapType, val); + } + cwsb.Append(" END"); ToSqlCaseWhenEnd(cwsb, col); sb.Append(cwsb); + cwsb.Clear(); } - cwsb.Clear(); } ++colidx; } From a76f7907f9ea8e3110c15303ecf24c0965cbc305 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 30 May 2023 09:42:35 +0800 Subject: [PATCH 53/58] v3.2.696 #1510 #1515 #1519 #1427 #1521 #1393 --- Directory.Build.props | 2 +- .../Controllers/HomeController.cs | 6 +- Examples/aspnetcore_transaction/Program.cs | 6 ++ Examples/aspnetcore_transaction/Startup.cs | 15 +++- .../TransactionalAttribute.cs | 1 + .../FreeSql.Extensions.AggregateRoot.csproj | 2 +- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- .../FreeSql.Extensions.Linq.csproj | 2 +- .../FreeSql.Generator.csproj | 2 +- FreeSql.All/FreeSql.All.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.Repository/FreeSql.Repository.csproj | 2 +- FreeSql/FreeSql.csproj | 2 +- .../CommonProvider/UpdateJoinProvider.cs | 2 +- FreeSql/Internal/ObjectPool/ObjectPool.cs | 73 +++++++++++++------ .../FreeSql.Provider.ClickHouse.csproj | 2 +- .../FreeSql.Provider.Custom.csproj | 2 +- .../FreeSql.Provider.Dameng.csproj | 2 +- .../FreeSql.Provider.Firebird.csproj | 2 +- .../FreeSql.Provider.GBase.csproj | 2 +- .../FreeSql.Provider.KingbaseES.csproj | 2 +- .../FreeSql.Provider.MsAccess.csproj | 2 +- .../FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- .../FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.OracleOledb.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.QuestDb.csproj | 2 +- .../FreeSql.Provider.ShenTong.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- ...FreeSql.Provider.SqlServerForSystem.csproj | 2 +- .../FreeSql.Provider.Sqlite.csproj | 2 +- .../FreeSql.Provider.SqliteCore.csproj | 2 +- .../FreeSql.Provider.Xugu.csproj | 2 +- 37 files changed, 103 insertions(+), 62 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 50c04bab..73f9d02e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Examples/aspnetcore_transaction/Controllers/HomeController.cs b/Examples/aspnetcore_transaction/Controllers/HomeController.cs index cf840c17..290e0bd5 100644 --- a/Examples/aspnetcore_transaction/Controllers/HomeController.cs +++ b/Examples/aspnetcore_transaction/Controllers/HomeController.cs @@ -34,12 +34,12 @@ namespace aspnetcore_transaction.Controllers } [HttpGet("2")] - //[Transactional] + [Transactional] public async Task GetAsync([FromServices] BaseRepository repoSong, [FromServices] BaseRepository repoDetail, [FromServices] SongRepository repoSong2, [FromServices] SongService serviceSong) { - await serviceSong.Test2(); - await serviceSong.Test3(); + await repoSong.InsertAsync(new Song()); + await repoDetail.InsertAsync(new Detail()); return "111"; } } diff --git a/Examples/aspnetcore_transaction/Program.cs b/Examples/aspnetcore_transaction/Program.cs index 282417ed..0e567ffa 100644 --- a/Examples/aspnetcore_transaction/Program.cs +++ b/Examples/aspnetcore_transaction/Program.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; namespace aspnetcore_transaction { @@ -12,6 +13,11 @@ namespace aspnetcore_transaction public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) + .ConfigureLogging(loggerBuilder => + { + loggerBuilder.SetMinimumLevel(LogLevel.Critical); + //loggerBuilder.ClearProviders(); + }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); diff --git a/Examples/aspnetcore_transaction/Startup.cs b/Examples/aspnetcore_transaction/Startup.cs index ad8b68a2..19e7cf89 100644 --- a/Examples/aspnetcore_transaction/Startup.cs +++ b/Examples/aspnetcore_transaction/Startup.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Linq; using System.Text; +using System.Threading; using aspnetcore_transaction.Controllers; using FreeSql; using Microsoft.AspNetCore.Builder; @@ -17,14 +18,18 @@ namespace aspnetcore_transaction { Configuration = configuration; Fsql = new FreeSqlBuilder() - .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\test_trans.db") + .UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=50;TrustServerCertificate=true") .UseAutoSyncStructure(true) - .UseMonitorCommand(cmd => Trace.WriteLine(cmd.CommandText)) + //.UseMonitorCommand(cmd => Trace.WriteLine(cmd.CommandText)) .UseNoneCommandParameter(true) .Build(); - Fsql.Aop.TraceBefore += (_, e) => Trace.WriteLine($"----TraceBefore---{e.Identifier} {e.Operation}"); - Fsql.Aop.TraceAfter += (_, e) => Trace.WriteLine($"----TraceAfter---{e.Identifier} {e.Operation} {e.Remark} {e.Exception?.Message} {e.ElapsedMilliseconds}ms\r\n"); + //Fsql.Aop.TraceBefore += (_, e) => Trace.WriteLine($"----TraceBefore---{e.Identifier} {e.Operation}"); + Fsql.Aop.TraceAfter += (_, e) => + { + //Trace.WriteLine($"----TraceAfter---{e.Identifier} {e.Operation} {e.Remark} {e.Exception?.Message} {e.ElapsedMilliseconds}ms\r\n"); + if (e.Exception != null && e.Exception.Message.StartsWith("【主库】状态不可用,等待后台检查程序恢复方可使用。") == false) Console.WriteLine(e.Exception.Message + " === " + Fsql.Ado.MasterPool.Statistics); + }; } public IConfiguration Configuration { get; } @@ -32,6 +37,8 @@ namespace aspnetcore_transaction public void ConfigureServices(IServiceCollection services) { + ThreadPool.SetMinThreads(1000, 1000); + services.AddControllersWithViews(); services.AddSingleton(Fsql); diff --git a/Examples/aspnetcore_transaction/TransactionalAttribute.cs b/Examples/aspnetcore_transaction/TransactionalAttribute.cs index 49812405..2ad38636 100644 --- a/Examples/aspnetcore_transaction/TransactionalAttribute.cs +++ b/Examples/aspnetcore_transaction/TransactionalAttribute.cs @@ -38,6 +38,7 @@ namespace FreeSql if (context.Exception == null) _uow.Commit(); else _uow.Rollback(); } + catch { } finally { _uow.Dispose(); diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index 1e77ee8d..5133b1d2 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index f86b9c3d..4f4a594a 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.696-preview20230524 + 3.2.696 diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index 75a81132..e8ae2910 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index b011d20d..097ca8e8 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230524 + 3.2.696 diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index d771e6ac..774212bf 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 010e3abd..698919b8 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.696-preview20230524 + 3.2.696 diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index a667484b..449efa87 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 4f2e91ba..9f198fc8 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 1cc27529..c97686bb 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 438f17f3..756e9f36 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/FreeSql/Internal/CommonProvider/UpdateJoinProvider.cs b/FreeSql/Internal/CommonProvider/UpdateJoinProvider.cs index 4825db0e..8242d20c 100644 --- a/FreeSql/Internal/CommonProvider/UpdateJoinProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateJoinProvider.cs @@ -174,7 +174,7 @@ namespace FreeSql.Internal.CommonProvider if (equalBinaryExp.Right.IsParameter()) { _query2Provider._groupby = null; - var valueExp = Expression.Lambda>(equalBinaryExp.Right, exp.Parameters); + var valueExp = Expression.Lambda>(Expression.Convert(equalBinaryExp.Right, typeof(object)), exp.Parameters); _query2.GroupBy(valueExp); valueSql = _query2Provider._groupby?.Remove(0, " \r\nGROUP BY ".Length); } diff --git a/FreeSql/Internal/ObjectPool/ObjectPool.cs b/FreeSql/Internal/ObjectPool/ObjectPool.cs index 6466eaca..3d043f3d 100644 --- a/FreeSql/Internal/ObjectPool/ObjectPool.cs +++ b/FreeSql/Internal/ObjectPool/ObjectPool.cs @@ -50,9 +50,9 @@ namespace FreeSql.Internal.ObjectPool { public IPolicy Policy { get; protected set; } - private List> _allObjects = new List>(); private object _allObjectsLock = new object(); - private ConcurrentStack> _freeObjects = new ConcurrentStack>(); + internal List> _allObjects = new List>(); + internal ConcurrentStack> _freeObjects = new ConcurrentStack>(); private ConcurrentQueue _getSyncQueue = new ConcurrentQueue(); private ConcurrentQueue>> _getAsyncQueue = new ConcurrentQueue>>(); @@ -112,8 +112,8 @@ namespace FreeSql.Internal.ObjectPool try { var conn = GetFree(false); - if (conn == null) throw new Exception(CoreStrings.Available_Failed_Get_Resource("CheckAvailable", this.Statistics)); - + if (conn == null) throw new Exception($"【{Policy.Name}】Failed to get resource {this.Statistics}"); + try { try @@ -125,7 +125,7 @@ namespace FreeSql.Internal.ObjectPool { conn.ResetValue(); } - if (Policy.OnCheckAvailable(conn) == false) throw new Exception(CoreStrings.Available_Thrown_Exception("CheckAvailable")); + if (Policy.OnCheckAvailable(conn) == false) throw new Exception("【{Policy.Name}】An exception needs to be thrown"); break; } finally @@ -177,11 +177,11 @@ namespace FreeSql.Internal.ObjectPool try { var conn = GetFree(false); - if (conn == null) throw new Exception(CoreStrings.Available_Failed_Get_Resource("LiveCheckAvailable", this.Statistics)); - + if (conn == null) throw new Exception($"【{Policy.Name}】Failed to get resource {this.Statistics}"); + try { - if (Policy.OnCheckAvailable(conn) == false) throw new Exception(CoreStrings.Available_Thrown_Exception("LiveCheckAvailable")); + if (Policy.OnCheckAvailable(conn) == false) throw new Exception("【{Policy.Name}】An exception needs to be thrown"); } finally { @@ -281,10 +281,10 @@ namespace FreeSql.Internal.ObjectPool { if (running == false) - throw new ObjectDisposedException(CoreStrings.Policy_ObjectPool_Dispose(Policy.Name)); + throw new ObjectDisposedException($"【{Policy.Name}】The ObjectPool has been disposed, see: https://github.com/dotnetcore/FreeSql/discussions/1079"); if (checkAvailable && UnavailableException != null) - throw new Exception(CoreStrings.Policy_Status_NotAvailable(Policy.Name,UnavailableException?.Message), UnavailableException); + throw new Exception($"【{Policy.Name}】Status unavailable, waiting for recovery. {UnavailableException?.Message}", UnavailableException); if ((_freeObjects.TryPop(out var obj) == false || obj == null) && _allObjects.Count < Policy.PoolSize) { @@ -335,12 +335,13 @@ namespace FreeSql.Internal.ObjectPool if (obj == null) obj = queueItem.ReturnValue; if (obj == null) lock (queueItem.Lock) queueItem.IsTimeout = (obj = queueItem.ReturnValue) == null; if (obj == null) obj = queueItem.ReturnValue; + if (queueItem.Exception != null) throw queueItem.Exception; if (obj == null) { Policy.OnGetTimeout(); if (Policy.IsThrowGetTimeoutException) - throw new TimeoutException(CoreStrings.ObjectPool_Get_Timeout(Policy.Name, "Get", timeout.Value.TotalSeconds)); + throw new TimeoutException($"【{Policy.Name}】ObjectPool.Get() timeout {timeout.Value.TotalSeconds} seconds, see: https://github.com/dotnetcore/FreeSql/discussions/1081"); return null; } @@ -372,7 +373,7 @@ namespace FreeSql.Internal.ObjectPool if (obj == null) { if (Policy.AsyncGetCapacity > 0 && _getAsyncQueue.Count >= Policy.AsyncGetCapacity - 1) - throw new OutOfMemoryException(CoreStrings.ObjectPool_GetAsync_Queue_Long(Policy.Name, Policy.AsyncGetCapacity)); + throw new OutOfMemoryException($"【{Policy.Name}】ObjectPool.GetAsync() The queue is too long. Policy. AsyncGetCapacity = {Policy.AsyncGetCapacity}"); var tcs = new TaskCompletionSource>(); @@ -392,7 +393,7 @@ namespace FreeSql.Internal.ObjectPool // Policy.GetTimeout(); // if (Policy.IsThrowGetTimeoutException) - // throw new Exception($"ObjectPool.GetAsync 获取超时({timeout.Value.TotalSeconds}秒)。"); + // throw new TimeoutException($"【{Policy.Name}】ObjectPool.GetAsync() timeout {timeout.Value.TotalSeconds} seconds, see: https://github.com/dotnetcore/FreeSql/discussions/1081"); // return null; //} @@ -444,16 +445,26 @@ namespace FreeSql.Internal.ObjectPool if (queueItem.ReturnValue != null) { - obj.LastReturnThreadId = Thread.CurrentThread.ManagedThreadId; - obj.LastReturnTime = DateTime.Now; - - try + if (UnavailableException != null) { - queueItem.Wait.Set(); - isReturn = true; + queueItem.Exception = new Exception($"【{Policy.Name}】Status unavailable, waiting for recovery. {UnavailableException?.Message}", UnavailableException); + try + { + queueItem.Wait.Set(); + } + catch { } } - catch + else { + obj.LastReturnThreadId = Thread.CurrentThread.ManagedThreadId; + obj.LastReturnTime = DateTime.Now; + + try + { + queueItem.Wait.Set(); + isReturn = true; + } + catch { } } } @@ -464,10 +475,25 @@ namespace FreeSql.Internal.ObjectPool { if (_getAsyncQueue.TryDequeue(out var tcs) && tcs != null && tcs.Task.IsCanceled == false) { - obj.LastReturnThreadId = Thread.CurrentThread.ManagedThreadId; - obj.LastReturnTime = DateTime.Now; + if (UnavailableException != null) + { + try + { + tcs.TrySetException(new Exception($"【{Policy.Name}】Status unavailable, waiting for recovery. {UnavailableException?.Message}", UnavailableException)); + } + catch { } + } + else + { + obj.LastReturnThreadId = Thread.CurrentThread.ManagedThreadId; + obj.LastReturnTime = DateTime.Now; - try { isReturn = tcs.TrySetResult(obj); } catch { } + try + { + isReturn = tcs.TrySetResult(obj); + } + catch { } + } } } } @@ -524,6 +550,7 @@ namespace FreeSql.Internal.ObjectPool internal Object ReturnValue { get; set; } internal object Lock = new object(); internal bool IsTimeout { get; set; } = false; + internal Exception Exception { get; set; } public void Dispose() { diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index 954c3476..96b28a41 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index 199121d6..cd446fd0 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index e8a9f1dc..69166801 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index e3c952c0..cd82e042 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 795b3366..356a6ffb 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index 93ac58c0..ea8fabfd 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index 33fb591b..bc185efb 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index efb7e12c..1c10d001 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 793d1ebd..14a90839 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index f1cdd696..e410c67c 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 8669accb..04ed01be 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index a357ebc7..c3c7c451 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index 798fb767..fd7457a1 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index c65227c2..665eb6b4 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index d889009a..f48a6a96 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index eafb875c..b357b6bd 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index 1c10dc39..b01353d2 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index a28a13ea..2b1fe4de 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index fd29fe59..9fd38f43 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696-preview20230524 + 3.2.696 diff --git a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj index 0b7258e0..d36990b3 100644 --- a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj +++ b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696-preview20230524 + 3.2.696 From 36c8a45e478598e43bb7b1152373d91d7a7c04d7 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 30 May 2023 18:21:57 +0800 Subject: [PATCH 54/58] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20IInsertOrUpdate.?= =?UTF-8?q?UpdateSet=20=E6=8C=87=E5=AE=9A=E6=9B=B4=E6=96=B0=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 16 ++++-- FreeSql.DbContext/FreeSql.DbContext.xml | 9 ---- FreeSql/FreeSql.xml | 10 ++++ FreeSql/Interface/Curd/IInsertOrUpdate.cs | 10 ++++ .../CommonProvider/InsertOrUpdateProvider.cs | 50 +++++++++++++++++++ .../Internal/CommonProvider/UpdateProvider.cs | 8 ++- .../MySql/Curd/CustomMySqlInsertOrUpdate.cs | 19 ++++++- .../Oracle/Curd/CustomOracleInsertOrUpdate.cs | 14 ++++-- .../Curd/CustomPostgreSQLInsertOrUpdate.cs | 21 +++++++- .../Curd/CustomSqlServerInsertOrUpdate.cs | 14 ++++-- .../Curd/DamengInsertOrUpdate.cs | 14 ++++-- .../Curd/FirebirdInsertOrUpdate.cs | 14 ++++-- .../Curd/GBaseInsertOrUpdate.cs | 14 ++++-- .../Curd/KingbaseESInsertOrUpdate.cs | 21 +++++++- .../Curd/MySqlInsertOrUpdate.cs | 19 ++++++- .../Dameng/Curd/OdbcDamengInsertOrUpdate.cs | 14 ++++-- .../Curd/OdbcKingbaseESInsertOrUpdate.cs | 21 +++++++- .../MySql/Curd/OdbcMySqlInsertOrUpdate.cs | 19 ++++++- .../Oracle/Curd/OdbcOracleInsertOrUpdate.cs | 14 ++++-- .../Curd/OdbcPostgreSQLInsertOrUpdate.cs | 21 +++++++- .../Curd/OdbcSqlServerInsertOrUpdate.cs | 14 ++++-- .../Curd/OracleInsertOrUpdate.cs | 14 ++++-- .../Curd/PostgreSQLInsertOrUpdate.cs | 21 +++++++- .../Curd/QuestDbInsertOrUpdate.cs | 21 +++++++- .../Curd/ShenTongInsertOrUpdate.cs | 14 ++++-- .../Curd/SqlServerInsertOrUpdate.cs | 14 ++++-- .../Curd/XuguInsertOrUpdate.cs | 14 ++++-- 27 files changed, 369 insertions(+), 85 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 21e5ca4f..d79842c0 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -566,14 +566,14 @@ namespace base_entity .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;min pool size=1;Max pool size=2;AllowLoadLocalInfile=true") - .UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=3;TrustServerCertificate=true") + //.UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=freesqlTest;Pooling=true;Max Pool Size=3;TrustServerCertificate=true") - //.UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=2") + .UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=2") //.UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=toc;Pooling=true;Maximum Pool Size=2") - //.UseNameConvert(FreeSql.Internal.NameConvertType.ToLower) + .UseNameConvert(FreeSql.Internal.NameConvertType.ToLower) - .UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2") - .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) + //.UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=2") + //.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) //.UseConnectionString(FreeSql.DataType.Dameng, "server=127.0.0.1;port=5236;user id=2user;password=123456789;database=2user;poolsize=5;min pool size=1") //.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) @@ -601,6 +601,12 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + var iouSetSql01 = fsql.InsertOrUpdate() + .SetSource(Enumerable.Range(0, 5).Select(a => new User1 { Id = Guid.NewGuid(), Nickname = $"nickname{a}", Username = $"username{a}", Description = $"desc{a}" }).ToArray()) + .UpdateSet((a, b) => a.Sort == b.Sort + 10) + .UpdateSet((a, b) => a.Nickname == "xxx") + .ToSql(); + var sqlastable1 = fsql.Select(101).AsTable((t, o) => "current_detail_230501").ToSql(); var sqlastable2 = fsql.Update(101).AsTable("current_detail_230501").Set(t => t.StatuId, 1).ToSql(); var sqlastable3 = fsql.Delete(101).AsTable("current_detail_230501").ToSql(); diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 26522f10..537315e2 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -800,14 +800,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 9f25ee32..9dd32b35 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1921,6 +1921,16 @@ 属性名,或者字段名 + + + 设置列的联表值,格式: + UpdateSet((a, b) => a.Clicks == b.xxx) + UpdateSet((a, b) => a.Clicks == a.Clicks + 1) + + + + + 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名; diff --git a/FreeSql/Interface/Curd/IInsertOrUpdate.cs b/FreeSql/Interface/Curd/IInsertOrUpdate.cs index 1e019c50..76e3ee20 100644 --- a/FreeSql/Interface/Curd/IInsertOrUpdate.cs +++ b/FreeSql/Interface/Curd/IInsertOrUpdate.cs @@ -86,6 +86,16 @@ namespace FreeSql /// IInsertOrUpdate UpdateColumns(string[] columns); + /// + /// 设置列的联表值,格式: + /// UpdateSet((a, b) => a.Clicks == b.xxx) + /// UpdateSet((a, b) => a.Clicks == a.Clicks + 1) + /// + /// + /// + /// + IInsertOrUpdate UpdateSet(Expression> exp); + /// /// 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名; /// diff --git a/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs b/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs index ed8dd94d..a45373c5 100644 --- a/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs @@ -23,6 +23,7 @@ namespace FreeSql.Internal.CommonProvider public bool _doNothing = false; public Dictionary _updateIgnore = new Dictionary(StringComparer.CurrentCultureIgnoreCase); public Dictionary _auditValueChangedDict = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + public Dictionary _updateSetDict = new Dictionary(); public TableInfo _table; public ColumnInfo[] _tempPrimarys; public Func _tableRule; @@ -87,6 +88,55 @@ namespace FreeSql.Internal.CommonProvider return this; } + public IInsertOrUpdate UpdateSet(Expression> exp) + { + var body = exp?.Body; + var nodeType = body?.NodeType; + if (nodeType == ExpressionType.Convert) + { + body = (body as UnaryExpression)?.Operand; + nodeType = body?.NodeType; + } + switch (nodeType) + { + case ExpressionType.Equal: + break; + default: + throw new Exception("格式错了,请使用 .Set((a,b) => a.name == b.xname)"); + } + + var equalBinaryExp = body as BinaryExpression; + var cols = new List(); + _commonExpression.ExpressionSelectColumn_MemberAccess(null, null, cols, SelectTableInfoType.From, equalBinaryExp.Left, true, null); + if (cols.Count != 1) return this; + var col = cols[0].Column; + var valueSql = ""; + + if (equalBinaryExp.Right.IsParameter()) + { + var tmpQuery = _orm.Select(); + var tmpQueryProvider = tmpQuery as Select0Provider; + tmpQueryProvider._tables[0].Alias = "t1"; + tmpQueryProvider._tables[0].Parameter = exp.Parameters[0]; + tmpQueryProvider._tables[1].Alias = "t2"; + tmpQueryProvider._tables[1].Parameter = exp.Parameters[1]; + var valueExp = Expression.Lambda>(Expression.Convert(equalBinaryExp.Right, typeof(object)), exp.Parameters); + tmpQuery.GroupBy(valueExp); + valueSql = tmpQueryProvider._groupby?.Remove(0, " \r\nGROUP BY ".Length); + } + else + { + valueSql = _commonExpression.ExpressionLambdaToSql(equalBinaryExp.Right, new CommonExpression.ExpTSC + { + isQuoteName = true, + mapType = equalBinaryExp.Right is BinaryExpression ? null : col.Attribute.MapType + }); + } + if (string.IsNullOrEmpty(valueSql)) return this; + _updateSetDict[col.Attribute.Name] = valueSql; + return this; + } + public static void AuditDataValue(object sender, IEnumerable data, IFreeSql orm, TableInfo table, Dictionary changedDict) { if (data?.Any() != true) return; diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 02a8c04d..29dfb2aa 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -894,7 +894,9 @@ namespace FreeSql.Internal.CommonProvider var sb = new StringBuilder(); sb.Append(_commonUtils.QuoteSqlName(col.Attribute.Name)).Append(" = "); - var valsameIf = col.Attribute.MapType.IsNumberType() || col.Attribute.MapType == typeof(string) || col.Attribute.MapType.NullableTypeOrThis().IsEnum; + var valsameIf = col.Attribute.MapType.IsNumberType() || + new[] { typeof(string), typeof(DateTime), typeof(DateTime?) }.Contains(col.Attribute.MapType) || + col.Attribute.MapType.NullableTypeOrThis().IsEnum; var ds = _source.Select(a => col.GetDbValue(a)).ToArray(); if (valsameIf && ds.All(a => object.Equals(a, ds[0]))) { @@ -1149,7 +1151,9 @@ namespace FreeSql.Internal.CommonProvider sb.Append(col.DbUpdateValue); else { - var valsameIf = col.Attribute.MapType.IsNumberType() || col.Attribute.MapType == typeof(string) || col.Attribute.MapType.NullableTypeOrThis().IsEnum; + var valsameIf = col.Attribute.MapType.IsNumberType() || + new[] { typeof(string), typeof(DateTime), typeof(DateTime?) }.Contains(col.Attribute.MapType) || + col.Attribute.MapType.NullableTypeOrThis().IsEnum; var ds = _source.Select(a => col.GetDbValue(a)).ToArray(); if (valsameIf && ds.All(a => object.Equals(a, ds[0]))) { diff --git a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsertOrUpdate.cs b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsertOrUpdate.cs index 1e68594b..8ad61e35 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsertOrUpdate.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Text; +using System.Text.RegularExpressions; namespace FreeSql.Custom.MySql { @@ -62,10 +63,26 @@ namespace FreeSql.Custom.MySql insert.InsertIdentity(); if (_doNothing == false) { - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); sql = new CustomMySqlOnDuplicateKeyUpdate(insert) .UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray()) .ToSql(); + if (_updateSetDict.Any()) + { + var findregex = new Regex("(t1|t2)." + _commonUtils.QuoteSqlName("test").Replace("test", "(\\w+)")); + foreach (var usd in _updateSetDict) + { + var field = _commonUtils.QuoteSqlName(usd.Key); + var findsql = $"{field} = VALUES({field})"; + var usdval = findregex.Replace(usd.Value, m => + { + if (m.Groups[1].Value == "t1") return _commonUtils.QuoteSqlName(m.Groups[2].Value); + return $"VALUES({_commonUtils.QuoteSqlName(m.Groups[2].Value)})"; + }); + sql = sql.Replace(findsql, $"{field} = {usdval}"); + } + } } else { diff --git a/Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleInsertOrUpdate.cs b/Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleInsertOrUpdate.cs index 5bdf2ad2..696fd8e5 100644 --- a/Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Custom/Oracle/Curd/CustomOracleInsertOrUpdate.cs @@ -39,14 +39,18 @@ namespace FreeSql.Custom.Oracle WriteSourceSelectUnionAll(data, sb, dbParams); sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _tempPrimarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(") \r\n"); - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); if (_doNothing == false && cols.Any()) sb.Append("WHEN MATCHED THEN \r\n") .Append(" update set ").Append(string.Join(", ", cols.Select(a => - a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}" - ))).Append(" \r\n"); + { + if (_updateSetDict.TryGetValue(a.Attribute.Name, out var valsql)) + return $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = {valsql}"; + return a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); if (tempPrimaryIsIdentity == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); diff --git a/Providers/FreeSql.Provider.Custom/PostgreSQL/Curd/CustomPostgreSQLInsertOrUpdate.cs b/Providers/FreeSql.Provider.Custom/PostgreSQL/Curd/CustomPostgreSQLInsertOrUpdate.cs index f45e05e9..ed3716f1 100644 --- a/Providers/FreeSql.Provider.Custom/PostgreSQL/Curd/CustomPostgreSQLInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Custom/PostgreSQL/Curd/CustomPostgreSQLInsertOrUpdate.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Text; +using System.Text.RegularExpressions; namespace FreeSql.Custom.PostgreSQL { @@ -57,11 +58,29 @@ namespace FreeSql.Custom.PostgreSQL { var ocdu = new CustomPostgreSQLOnConflictDoUpdate(insert.InsertIdentity()); ocdu._tempPrimarys = _tempPrimarys; - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); ocdu.UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray()); if (_doNothing == true || cols.Any() == false) ocdu.DoNothing(); sql = ocdu.ToSql(); + + if (_updateSetDict.Any()) + { + var findregex = new Regex("(t1|t2)." + _commonUtils.QuoteSqlName("test").Replace("test", "(\\w+)")); + var tableName = _commonUtils.QuoteSqlName(TableRuleInvoke()); + foreach (var usd in _updateSetDict) + { + var field = _commonUtils.QuoteSqlName(usd.Key); + var findsql = $"{field} = EXCLUDED.{field}"; + var usdval = findregex.Replace(usd.Value, m => + { + if (m.Groups[1].Value == "t1") return $"{tableName}.{_commonUtils.QuoteSqlName(m.Groups[2].Value)}"; + return $"EXCLUDED.{_commonUtils.QuoteSqlName(m.Groups[2].Value)}"; + }); + sql = sql.Replace(findsql, $"{field} = {usdval}"); + } + } } if (string.IsNullOrEmpty(sql)) return null; if (insert._params?.Any() == true) dbParams.AddRange(insert._params); diff --git a/Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerInsertOrUpdate.cs b/Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerInsertOrUpdate.cs index 60d9f245..d862228a 100644 --- a/Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Custom/SqlServer/Curd/CustomSqlServerInsertOrUpdate.cs @@ -41,14 +41,18 @@ namespace FreeSql.Custom.SqlServer WriteSourceSelectUnionAll(data, sb, dbParams); sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _tempPrimarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(") \r\n"); - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); if (_doNothing == false && cols.Any()) sb.Append("WHEN MATCHED THEN \r\n") .Append(" update set ").Append(string.Join(", ", cols.Select(a => - a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}" - ))).Append(" \r\n"); + { + if (_updateSetDict.TryGetValue(a.Attribute.Name, out var valsql)) + return $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = {valsql}"; + return a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); if (tempPrimaryIsIdentity == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); diff --git a/Providers/FreeSql.Provider.Dameng/Curd/DamengInsertOrUpdate.cs b/Providers/FreeSql.Provider.Dameng/Curd/DamengInsertOrUpdate.cs index 8893c1f1..1436b6fc 100644 --- a/Providers/FreeSql.Provider.Dameng/Curd/DamengInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Dameng/Curd/DamengInsertOrUpdate.cs @@ -39,14 +39,18 @@ namespace FreeSql.Dameng.Curd WriteSourceSelectUnionAll(data, sb, dbParams); sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _tempPrimarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(") \r\n"); - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); if (_doNothing == false && cols.Any()) sb.Append("WHEN MATCHED THEN \r\n") .Append(" update set ").Append(string.Join(", ", cols.Select(a => - a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}" - ))).Append(" \r\n"); + { + if (_updateSetDict.TryGetValue(a.Attribute.Name, out var valsql)) + return $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = {valsql}"; + return a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); if (tempPrimaryIsIdentity == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); diff --git a/Providers/FreeSql.Provider.Firebird/Curd/FirebirdInsertOrUpdate.cs b/Providers/FreeSql.Provider.Firebird/Curd/FirebirdInsertOrUpdate.cs index bd9bda60..c2ffe814 100644 --- a/Providers/FreeSql.Provider.Firebird/Curd/FirebirdInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Firebird/Curd/FirebirdInsertOrUpdate.cs @@ -39,14 +39,18 @@ namespace FreeSql.Firebird.Curd WriteSourceSelectUnionAll(data, sb, dbParams); sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _tempPrimarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(") \r\n"); - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); if (_doNothing == false && cols.Any()) sb.Append("WHEN MATCHED THEN \r\n") .Append(" update set ").Append(string.Join(", ", cols.Select(a => - a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}" - ))).Append(" \r\n"); + { + if (_updateSetDict.TryGetValue(a.Attribute.Name, out var valsql)) + return $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = {valsql}"; + return a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); if (tempPrimaryIsIdentity == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); diff --git a/Providers/FreeSql.Provider.GBase/Curd/GBaseInsertOrUpdate.cs b/Providers/FreeSql.Provider.GBase/Curd/GBaseInsertOrUpdate.cs index 4b6756c4..66719f42 100644 --- a/Providers/FreeSql.Provider.GBase/Curd/GBaseInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.GBase/Curd/GBaseInsertOrUpdate.cs @@ -39,14 +39,18 @@ namespace FreeSql.GBase.Curd WriteSourceSelectUnionAll(data, sb, dbParams); sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _tempPrimarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(") \r\n"); - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); if (_doNothing == false && cols.Any()) sb.Append("WHEN MATCHED THEN \r\n") .Append(" update set ").Append(string.Join(", ", cols.Select(a => - a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? - $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : - $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}" - ))).Append(" \r\n"); + { + if (_updateSetDict.TryGetValue(a.Attribute.Name, out var valsql)) + return $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = {valsql}"; + return a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? + $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : + $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); if (tempPrimaryIsIdentity == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); diff --git a/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESInsertOrUpdate.cs b/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESInsertOrUpdate.cs index f87ac788..511c0961 100644 --- a/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESInsertOrUpdate.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Text; +using System.Text.RegularExpressions; namespace FreeSql.KingbaseES { @@ -57,11 +58,29 @@ namespace FreeSql.KingbaseES { var ocdu = new KingbaseESOnConflictDoUpdate(insert.InsertIdentity()); ocdu._tempPrimarys = _tempPrimarys; - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); ocdu.UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray()); if (_doNothing == true || cols.Any() == false) ocdu.DoNothing(); sql = ocdu.ToSql(); + + if (_updateSetDict.Any()) + { + var findregex = new Regex("(t1|t2)." + _commonUtils.QuoteSqlName("test").Replace("test", "(\\w+)")); + var tableName = _commonUtils.QuoteSqlName(TableRuleInvoke()); + foreach (var usd in _updateSetDict) + { + var field = _commonUtils.QuoteSqlName(usd.Key); + var findsql = $"{field} = EXCLUDED.{field}"; + var usdval = findregex.Replace(usd.Value, m => + { + if (m.Groups[1].Value == "t1") return $"{tableName}.{_commonUtils.QuoteSqlName(m.Groups[2].Value)}"; + return $"EXCLUDED.{_commonUtils.QuoteSqlName(m.Groups[2].Value)}"; + }); + sql = sql.Replace(findsql, $"{field} = {usdval}"); + } + } } if (string.IsNullOrEmpty(sql)) return null; if (insert._params?.Any() == true) dbParams.AddRange(insert._params); diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs index d75c3a28..2afc1ca9 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Text; +using System.Text.RegularExpressions; namespace FreeSql.MySql.Curd { @@ -62,10 +63,26 @@ namespace FreeSql.MySql.Curd insert.InsertIdentity(); if (_doNothing == false) { - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); sql = new OnDuplicateKeyUpdate(insert) .UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray()) .ToSql(); + if (_updateSetDict.Any()) + { + var findregex = new Regex("(t1|t2)." + _commonUtils.QuoteSqlName("test").Replace("test", "(\\w+)")); + foreach (var usd in _updateSetDict) + { + var field = _commonUtils.QuoteSqlName(usd.Key); + var findsql = $"{field} = VALUES({field})"; + var usdval = findregex.Replace(usd.Value, m => + { + if (m.Groups[1].Value == "t1") return _commonUtils.QuoteSqlName(m.Groups[2].Value); + return $"VALUES({_commonUtils.QuoteSqlName(m.Groups[2].Value)})"; + }); + sql = sql.Replace(findsql, $"{field} = {usdval}"); + } + } } else { diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsertOrUpdate.cs index d35c1097..5f1debb7 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsertOrUpdate.cs @@ -39,14 +39,18 @@ namespace FreeSql.Odbc.Dameng WriteSourceSelectUnionAll(data, sb, dbParams); sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _tempPrimarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(") \r\n"); - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); if (_doNothing == false && cols.Any()) sb.Append("WHEN MATCHED THEN \r\n") .Append(" update set ").Append(string.Join(", ", cols.Select(a => - a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}" - ))).Append(" \r\n"); + { + if (_updateSetDict.TryGetValue(a.Attribute.Name, out var valsql)) + return $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = {valsql}"; + return a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); if (tempPrimaryIsIdentity == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESInsertOrUpdate.cs index a307b2ca..d5bb8565 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESInsertOrUpdate.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Text; +using System.Text.RegularExpressions; namespace FreeSql.Odbc.KingbaseES { @@ -58,11 +59,29 @@ namespace FreeSql.Odbc.KingbaseES { var ocdu = new OdbcKingbaseESOnConflictDoUpdate(insert.InsertIdentity()); ocdu._tempPrimarys = _tempPrimarys; - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); ocdu.UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray()); if (_doNothing == true || cols.Any() == false) ocdu.DoNothing(); sql = ocdu.ToSql(); + + if (_updateSetDict.Any()) + { + var findregex = new Regex("(t1|t2)." + _commonUtils.QuoteSqlName("test").Replace("test", "(\\w+)")); + var tableName = _commonUtils.QuoteSqlName(TableRuleInvoke()); + foreach (var usd in _updateSetDict) + { + var field = _commonUtils.QuoteSqlName(usd.Key); + var findsql = $"{field} = EXCLUDED.{field}"; + var usdval = findregex.Replace(usd.Value, m => + { + if (m.Groups[1].Value == "t1") return $"{tableName}.{_commonUtils.QuoteSqlName(m.Groups[2].Value)}"; + return $"EXCLUDED.{_commonUtils.QuoteSqlName(m.Groups[2].Value)}"; + }); + sql = sql.Replace(findsql, $"{field} = {usdval}"); + } + } } if (string.IsNullOrEmpty(sql)) return null; if (insert._params?.Any() == true) dbParams.AddRange(insert._params); diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs index 5aefcaf9..83d90f1d 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Text; +using System.Text.RegularExpressions; namespace FreeSql.Odbc.MySql { @@ -62,10 +63,26 @@ namespace FreeSql.Odbc.MySql insert.InsertIdentity(); if (_doNothing == false) { - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); sql = new OdbcMySqlOnDuplicateKeyUpdate(insert) .UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray()) .ToSql(); + if (_updateSetDict.Any()) + { + var findregex = new Regex("(t1|t2)." + _commonUtils.QuoteSqlName("test").Replace("test", "(\\w+)")); + foreach (var usd in _updateSetDict) + { + var field = _commonUtils.QuoteSqlName(usd.Key); + var findsql = $"{field} = VALUES({field})"; + var usdval = findregex.Replace(usd.Value, m => + { + if (m.Groups[1].Value == "t1") return _commonUtils.QuoteSqlName(m.Groups[2].Value); + return $"VALUES({_commonUtils.QuoteSqlName(m.Groups[2].Value)})"; + }); + sql = sql.Replace(findsql, $"{field} = {usdval}"); + } + } } else { diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsertOrUpdate.cs index b70eb435..72da5a97 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsertOrUpdate.cs @@ -39,14 +39,18 @@ namespace FreeSql.Odbc.Oracle WriteSourceSelectUnionAll(data, sb, dbParams); sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _tempPrimarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(") \r\n"); - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); if (_doNothing == false && cols.Any()) sb.Append("WHEN MATCHED THEN \r\n") .Append(" update set ").Append(string.Join(", ", cols.Select(a => - a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}" - ))).Append(" \r\n"); + { + if (_updateSetDict.TryGetValue(a.Attribute.Name, out var valsql)) + return $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = {valsql}"; + return a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); if (tempPrimaryIsIdentity == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs index 2c6b2f6f..e0a60d74 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Text; +using System.Text.RegularExpressions; namespace FreeSql.Odbc.PostgreSQL { @@ -57,11 +58,29 @@ namespace FreeSql.Odbc.PostgreSQL { var ocdu = new OdbcPostgreSQLOnConflictDoUpdate(insert.InsertIdentity()); ocdu._tempPrimarys = _tempPrimarys; - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); ocdu.UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray()); if (_doNothing == true || cols.Any() == false) ocdu.DoNothing(); sql = ocdu.ToSql(); + + if (_updateSetDict.Any()) + { + var findregex = new Regex("(t1|t2)." + _commonUtils.QuoteSqlName("test").Replace("test", "(\\w+)")); + var tableName = _commonUtils.QuoteSqlName(TableRuleInvoke()); + foreach (var usd in _updateSetDict) + { + var field = _commonUtils.QuoteSqlName(usd.Key); + var findsql = $"{field} = EXCLUDED.{field}"; + var usdval = findregex.Replace(usd.Value, m => + { + if (m.Groups[1].Value == "t1") return $"{tableName}.{_commonUtils.QuoteSqlName(m.Groups[2].Value)}"; + return $"EXCLUDED.{_commonUtils.QuoteSqlName(m.Groups[2].Value)}"; + }); + sql = sql.Replace(findsql, $"{field} = {usdval}"); + } + } } if (string.IsNullOrEmpty(sql)) return null; if (insert._params?.Any() == true) dbParams.AddRange(insert._params); diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsertOrUpdate.cs index b53974dc..8db1590f 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsertOrUpdate.cs @@ -41,14 +41,18 @@ namespace FreeSql.Odbc.SqlServer WriteSourceSelectUnionAll(data, sb, dbParams); sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _tempPrimarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(") \r\n"); - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); if (_doNothing == false && cols.Any()) sb.Append("WHEN MATCHED THEN \r\n") .Append(" update set ").Append(string.Join(", ", cols.Select(a => - a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}" - ))).Append(" \r\n"); + { + if (_updateSetDict.TryGetValue(a.Attribute.Name, out var valsql)) + return $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = {valsql}"; + return a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); if (tempPrimaryIsIdentity == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); diff --git a/Providers/FreeSql.Provider.Oracle/Curd/OracleInsertOrUpdate.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsertOrUpdate.cs index ace26d30..f2612dbb 100644 --- a/Providers/FreeSql.Provider.Oracle/Curd/OracleInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsertOrUpdate.cs @@ -39,14 +39,18 @@ namespace FreeSql.Oracle.Curd WriteSourceSelectUnionAll(data, sb, dbParams); sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _tempPrimarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(") \r\n"); - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); if (_doNothing == false && cols.Any()) sb.Append("WHEN MATCHED THEN \r\n") .Append(" update set ").Append(string.Join(", ", cols.Select(a => - a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}" - ))).Append(" \r\n"); + { + if (_updateSetDict.TryGetValue(a.Attribute.Name, out var valsql)) + return $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = {valsql}"; + return a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); if (tempPrimaryIsIdentity == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs index 64f3b31a..01b215bb 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Text; +using System.Text.RegularExpressions; namespace FreeSql.PostgreSQL.Curd { @@ -57,11 +58,29 @@ namespace FreeSql.PostgreSQL.Curd { var ocdu = new OnConflictDoUpdate(insert.InsertIdentity()); ocdu._tempPrimarys = _tempPrimarys; - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); ocdu.UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray()); if (_doNothing == true || cols.Any() == false) ocdu.DoNothing(); sql = ocdu.ToSql(); + + if (_updateSetDict.Any()) + { + var findregex = new Regex("(t1|t2)." + _commonUtils.QuoteSqlName("test").Replace("test", "(\\w+)")); + var tableName = _commonUtils.QuoteSqlName(TableRuleInvoke()); + foreach (var usd in _updateSetDict) + { + var field = _commonUtils.QuoteSqlName(usd.Key); + var findsql = $"{field} = EXCLUDED.{field}"; + var usdval = findregex.Replace(usd.Value, m => + { + if (m.Groups[1].Value == "t1") return $"{tableName}.{_commonUtils.QuoteSqlName(m.Groups[2].Value)}"; + return $"EXCLUDED.{_commonUtils.QuoteSqlName(m.Groups[2].Value)}"; + }); + sql = sql.Replace(findsql, $"{field} = {usdval}"); + } + } } if (string.IsNullOrEmpty(sql)) return null; if (insert._params?.Any() == true) dbParams.AddRange(insert._params); diff --git a/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbInsertOrUpdate.cs b/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbInsertOrUpdate.cs index 5e4af026..5db6154a 100644 --- a/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.QuestDb/Curd/QuestDbInsertOrUpdate.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Text; +using System.Text.RegularExpressions; namespace FreeSql.QuestDb.Curd { @@ -57,11 +58,29 @@ namespace FreeSql.QuestDb.Curd { var ocdu = new OnConflictDoUpdate(insert.InsertIdentity()); ocdu._tempPrimarys = _tempPrimarys; - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); ocdu.UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray()); if (_doNothing == true || cols.Any() == false) ocdu.DoNothing(); sql = ocdu.ToSql(); + + if (_updateSetDict.Any()) + { + var findregex = new Regex("(t1|t2)." + _commonUtils.QuoteSqlName("test").Replace("test", "(\\w+)")); + var tableName = _commonUtils.QuoteSqlName(TableRuleInvoke()); + foreach (var usd in _updateSetDict) + { + var field = _commonUtils.QuoteSqlName(usd.Key); + var findsql = $"{field} = EXCLUDED.{field}"; + var usdval = findregex.Replace(usd.Value, m => + { + if (m.Groups[1].Value == "t1") return $"{tableName}.{_commonUtils.QuoteSqlName(m.Groups[2].Value)}"; + return $"EXCLUDED.{_commonUtils.QuoteSqlName(m.Groups[2].Value)}"; + }); + sql = sql.Replace(findsql, $"{field} = {usdval}"); + } + } } if (string.IsNullOrEmpty(sql)) return null; if (insert._params?.Any() == true) dbParams.AddRange(insert._params); diff --git a/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongInsertOrUpdate.cs b/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongInsertOrUpdate.cs index 6bdd3648..009f3287 100644 --- a/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongInsertOrUpdate.cs @@ -39,14 +39,18 @@ namespace FreeSql.ShenTong.Curd WriteSourceSelectUnionAll(data, sb, dbParams); sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _tempPrimarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(") \r\n"); - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); if (_doNothing == false && cols.Any()) sb.Append("WHEN MATCHED THEN \r\n") .Append(" update set ").Append(string.Join(", ", cols.Select(a => - a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}" - ))).Append(" \r\n"); + { + if (_updateSetDict.TryGetValue(a.Attribute.Name, out var valsql)) + return $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = {valsql}"; + return a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); if (tempPrimaryIsIdentity == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); diff --git a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsertOrUpdate.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsertOrUpdate.cs index 562c687a..37fa76da 100644 --- a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsertOrUpdate.cs @@ -41,14 +41,18 @@ namespace FreeSql.SqlServer.Curd WriteSourceSelectUnionAll(data, sb, dbParams); sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _tempPrimarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(") \r\n"); - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); if (_doNothing == false && cols.Any()) sb.Append("WHEN MATCHED THEN \r\n") .Append(" update set ").Append(string.Join(", ", cols.Select(a => - a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}" - ))).Append(" \r\n"); + { + if (_updateSetDict.TryGetValue(a.Attribute.Name, out var valsql)) + return $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = {valsql}"; + return a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); if (tempPrimaryIsIdentity == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); diff --git a/Providers/FreeSql.Provider.Xugu/Curd/XuguInsertOrUpdate.cs b/Providers/FreeSql.Provider.Xugu/Curd/XuguInsertOrUpdate.cs index 0ba04315..8186d645 100644 --- a/Providers/FreeSql.Provider.Xugu/Curd/XuguInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Xugu/Curd/XuguInsertOrUpdate.cs @@ -45,14 +45,18 @@ namespace FreeSql.Xugu.Curd WriteSourceSelectUnionAll(data, sb, dbParams); sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _tempPrimarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(") \r\n"); - var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); + var cols = _table.Columns.Values.Where(a => _updateSetDict.ContainsKey(a.Attribute.Name) || + _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && a.Attribute.IsIdentity == false && _updateIgnore.ContainsKey(a.Attribute.Name) == false); if (_doNothing == false && cols.Any()) sb.Append("WHEN MATCHED THEN \r\n") .Append(" update set ").Append(string.Join(", ", cols.Select(a => - a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : - $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}" - ))).Append(" \r\n"); + { + if (_updateSetDict.TryGetValue(a.Attribute.Name, out var valsql)) + return $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = {valsql}"; + return a.Attribute.IsVersion && a.Attribute.MapType != typeof(byte[]) ? + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} + 1" : + $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"; + }))).Append(" \r\n"); cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true); if (tempPrimaryIsIdentity == false) cols = cols.Where(a => a.Attribute.IsIdentity == false || string.IsNullOrEmpty(a.DbInsertValue) == false); From 667975362e5be5a77ce1be9722e60e311c6dd843 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 30 May 2023 18:24:46 +0800 Subject: [PATCH 55/58] v3.2.697-preview20230530 --- Directory.Build.props | 2 +- .../FreeSql.Extensions.AggregateRoot.csproj | 2 +- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- .../FreeSql.Extensions.Linq.csproj | 2 +- .../FreeSql.Generator.csproj | 2 +- FreeSql.All/FreeSql.All.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.xml | 9 ++ FreeSql.Repository/FreeSql.Repository.csproj | 2 +- FreeSql/FreeSql.csproj | 2 +- FreeSql/FreeSql.xml | 98 ------------------- .../FreeSql.Provider.ClickHouse.csproj | 2 +- .../FreeSql.Provider.Custom.csproj | 2 +- .../FreeSql.Provider.Dameng.csproj | 2 +- .../FreeSql.Provider.Firebird.csproj | 2 +- .../FreeSql.Provider.GBase.csproj | 2 +- .../FreeSql.Provider.KingbaseES.csproj | 2 +- .../FreeSql.Provider.MsAccess.csproj | 2 +- .../FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- .../FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.OracleOledb.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.QuestDb.csproj | 2 +- .../FreeSql.Provider.ShenTong.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- ...FreeSql.Provider.SqlServerForSystem.csproj | 2 +- .../FreeSql.Provider.Sqlite.csproj | 2 +- .../FreeSql.Provider.SqliteCore.csproj | 2 +- .../FreeSql.Provider.Xugu.csproj | 2 +- 33 files changed, 40 insertions(+), 129 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 73f9d02e..bdd7c90e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index 5133b1d2..e2f5439e 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index 4f4a594a..20db3c8a 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.696 + 3.2.697-preview20230530 diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index e8ae2910..e2af12da 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index 097ca8e8..1938594e 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696 + 3.2.697-preview20230530 diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index 774212bf..87230cfb 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 698919b8..02179803 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.696 + 3.2.697-preview20230530 diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index 449efa87..58581548 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 9f198fc8..f8020cd7 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 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.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index c97686bb..c8839dda 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 756e9f36..891598e0 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 9dd32b35..13464ef2 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1073,82 +1073,6 @@ - - - 动态创建实体类型 - - - - - 配置Class - - 类名 - 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] - - - - - 配置属性 - - 属性名称 - 属性类型 - 属性标记的特性-支持多个 - - - - - 配置属性 - - 属性名称 - 属性类型 - 该属性是否重写父类属性 - 属性标记的特性-支持多个 - - - - - 配置属性 - - 属性名称 - 属性类型 - 该属性是否重写父类属性 - 属性默认值 - 属性标记的特性-支持多个 - - - - - 配置父类 - - 父类类型 - - - - - Override属性 - - - - - - Emit动态创建出Class - Type - - - - - - 首字母小写 - - - - - - - 首字母大写 - - - - 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -5786,28 +5710,6 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 - - - 动态构建Class Type - - - - - - 根据字典,创建 table 对应的实体对象 - - - - - - - - 根据实体对象,创建 table 对应的字典 - - - - - C#: that >= between && that <= and diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index 96b28a41..a52c812a 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index cd446fd0..036aaed4 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index 69166801..9aeae760 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index cd82e042..cbd5f5e8 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 356a6ffb..d8d23bbe 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index ea8fabfd..c40d88b0 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index bc185efb..66e88b20 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 1c10d001..1ad72eff 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 14a90839..350827a8 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index e410c67c..c3b48d48 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 04ed01be..c5f95b7e 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index c3c7c451..b1217da7 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index fd7457a1..5be00f8e 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index 665eb6b4..324f3a8e 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index f48a6a96..8a2059ed 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index b357b6bd..a2796e3c 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index b01353d2..40abf26d 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index 2b1fe4de..5bb70b2a 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index 9fd38f43..850030b0 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.696 + 3.2.697-preview20230530 diff --git a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj index d36990b3..08d38f88 100644 --- a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj +++ b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.696 + 3.2.697-preview20230530 From 3c47aaf8feb779c8355d6fd251e6e015fb4925fd Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 31 May 2023 13:48:05 +0800 Subject: [PATCH 56/58] update internal code --- FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index 786e1803..dc96f6ed 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -138,8 +138,27 @@ public static partial class FreeSqlGlobalExtensions .Append(string.Join(", ", genericParameters.Select(a => a.DisplayCsharp()))) .Append('>'); - sb.Append('(').Append(string.Join(", ", method.GetParameters().Select(a => $"{a.ParameterType.DisplayCsharp()} {a.Name}"))).Append(')'); + sb.Append("(").Append(string.Join(", ", method.GetParameters().Select(a => LocalDisplayCsharpParameter(a)))).Append(")"); return sb.ToString(); + + string LocalDisplayCsharpParameter(ParameterInfo lp) + { + var pstr = ""; + object[] pattrs = new object[0]; + try { pattrs = lp.GetCustomAttributes(false); } catch { } + if (pattrs.Any(a => a is ParamArrayAttribute)) pstr = "params "; + pstr = $"{pstr}{lp.ParameterType.DisplayCsharp()} {lp.Name}"; +#if net40 + if (pattrs.Any(a => a is System.Runtime.InteropServices.OptionalAttribute) == false) return pstr; +#else + if (lp.HasDefaultValue == false) return pstr; +#endif + if (lp.DefaultValue == null) return $"{pstr} = null"; + if (lp.ParameterType == typeof(string)) return $"{pstr} = \"{lp.DefaultValue.ToString().Replace("\"", "\\\"").Replace("\r\n", "\\r\\n").Replace("\n", "\\n")}\""; + if (lp.ParameterType == typeof(bool) || lp.ParameterType == typeof(bool?)) return $"{pstr} = {lp.DefaultValue.ToString().Replace("False", "false").Replace("True", "true")}"; + if (lp.ParameterType.IsEnum) return $"{pstr} = {lp.ParameterType.DisplayCsharp(false)}.{lp.DefaultValue}"; + return $"{pstr} = {lp.DefaultValue}"; + } } public static object CreateInstanceGetDefaultValue(this Type that) { From 6ab7766d74e56709c38362772f3e7f74528163c0 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 6 Jun 2023 11:23:25 +0800 Subject: [PATCH 57/58] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=203.2.696=20?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=88=86=E8=A1=A8=20bug=EF=BC=9B#1527=20e798?= =?UTF-8?q?60164d5d12e4f7df747f0e29503dff301cb7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 195 +++++++++--------- FreeSql/FreeSql.xml | 98 +++++++++ .../Internal/CommonProvider/DeleteProvider.cs | 4 +- .../Internal/CommonProvider/UpdateProvider.cs | 4 +- 4 files changed, 203 insertions(+), 98 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index d79842c0..b08598d3 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -601,113 +601,21 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion - var iouSetSql01 = fsql.InsertOrUpdate() - .SetSource(Enumerable.Range(0, 5).Select(a => new User1 { Id = Guid.NewGuid(), Nickname = $"nickname{a}", Username = $"username{a}", Description = $"desc{a}" }).ToArray()) - .UpdateSet((a, b) => a.Sort == b.Sort + 10) - .UpdateSet((a, b) => a.Nickname == "xxx") - .ToSql(); + var sqlastable1 = fsql.Select(101).AsTable((t, o) => "current_detail_230501").ToSql(); var sqlastable2 = fsql.Update(101).AsTable("current_detail_230501").Set(t => t.StatuId, 1).ToSql(); var sqlastable3 = fsql.Delete(101).AsTable("current_detail_230501").ToSql(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - var longRawData = Encoding.UTF8.GetBytes(string.Join(",", Enumerable.Range(1, 2000).Select(a => "中国人"))); - fsql.Insert(new OracleLongRaw1 { data = longRawData }).NoneParameter(false).ExecuteAffrows(); - fsql.Insert(new OracleLongRaw1 { data = longRawData }).NoneParameter(true).ExecuteAffrows(); - var longRaw1 = fsql.Select().ToList(); - - MarketingRestrictions restrictions = new MarketingRestrictions(); - - if (restrictions.Id == Guid.Empty) - { - restrictions.CreatedBy = 100; - } - else - { - restrictions.UpdatedBy = 100; - restrictions.UpdatedTime = DateTime.Now; - } - - int ret = fsql.InsertOrUpdate() - .SetSource(restrictions) - .UpdateColumns(r => new { - r.Describe, - r.IsLimitUsePoints, - r.Status, - r.StartTime, - r.EndTime, - r.UpdatedBy, - r.UpdatedTime - }) - .ExecuteAffrows(); - - - var query2222 = fsql.Select() - .AsTable((t, o) => string.Format(o, "hash2")) - .Where(p => p.Name.Contains("search")) - .GroupBy(a => new { a.ClassId }) - .WithTempQuery(a => a.Key); -var sql11111 = fsql.Select() - .AsTable((t, o) => string.Format(o, "hash1")) - .Where(s => query2222 - .ToList(p => p.ClassId) - .Contains(s.Id)) - .ToSql(s => new - { - s.Id, - s.Name, - }); - - var isusers01 = fsql.Select() - .Where(e => e.Property("项目执行情况") == "结题") - .GroupBy(e => new { ProjectLevel = e.Property("项目级别") }) - .ToSql(e => new - { - e.Key.ProjectLevel, - Test = e.Value.Group.Property("批准经费总额(万元)"), - }); - isusers01 = fsql.Select() - .Where(e => e.Property("项目执行情况") == "结题") - .GroupBy(e => new { ProjectLevel = e.Property("项目级别") }) - .WithTempQuery(e => new - { - e.Key.ProjectLevel, - Test = e.Value.Group.Property("批准经费总额(万元)"), - }) - .ToSql(); - - var bulkUsers = new[] { - new IdentityUser1 { Nickname = "nickname11", Username = "username11" }, - new IdentityUser1 { Nickname = "nickname12", Username = "username12" }, - new IdentityUser1 { Nickname = "nickname13", Username = "username13" }, - - new IdentityUser1 { Nickname = "nickname21", Username = "username21" }, - new IdentityUser1 { Nickname = "nickname22", Username = "username22" }, - new IdentityUser1 { Nickname = "nickname23", Username = "username23" } - }; - fsql.Insert(bulkUsers).NoneParameter().ExecuteAffrows(); - fsql.Insert(bulkUsers).IgnoreInsertValueSql(a => a.Nickname).NoneParameter().ExecuteAffrows(); - bulkUsers = fsql.Select().OrderByDescending(a => a.Id).Limit(3).ToList().ToArray(); - bulkUsers[0].Nickname += "_bulkupdate"; - bulkUsers[1].Nickname += "_bulkupdate"; - bulkUsers[2].Nickname += "_bulkupdate"; - fsql.Update().SetSource(bulkUsers).ExecuteSqlBulkCopy(); - - - var objtsql1 = fsql.Select().WithSql("select * from user1").ToList(); - var objtsql2 = fsql.Select().WithSql("select * from user1").ToList(); - var astsql = fsql.Select() .InnerJoin((a, b) => a.id == b.Id) - .OrderBy((a,b) => a.createtime) + .OrderBy((a, b) => a.createtime) .ToSql(); //var table = fsql.CodeFirst.GetTableByEntity(typeof(AsTableLog)); //table.SetAsTable(new ModAsTableImpl(fsql), table.ColumnsByCs[nameof(AsTableLog.click)]); - var testitems = new[] { new AsTableLog{ msg = "msg01", createtime = DateTime.Parse("2022-1-1 13:00:11"), click = 1 }, @@ -725,6 +633,10 @@ var sql11111 = fsql.Select() var sqlat = sqlatb.ToSql(); var sqlatr = sqlatb.ExecuteAffrows(); + //var sqlatc1 = fsql.Delete().Where(a => a.click < 0); + //var sqlatca1 = sqlatc1.ToSql(); + //var sqlatcr1 = sqlatc1.ExecuteAffrows(); + var sqlatc1 = fsql.Delete().Where(a => a.id == Guid.NewGuid() && a.createtime == DateTime.Parse("2022-3-8 15:00:13")); var sqlatca1 = sqlatc1.ToSql(); var sqlatcr1 = sqlatc1.ExecuteAffrows(); @@ -815,6 +727,101 @@ var sql11111 = fsql.Select() }); + var iouSetSql01 = fsql.InsertOrUpdate() + .SetSource(Enumerable.Range(0, 5).Select(a => new User1 { Id = Guid.NewGuid(), Nickname = $"nickname{a}", Username = $"username{a}", Description = $"desc{a}" }).ToArray()) + .UpdateSet((a, b) => a.Sort == b.Sort + 10) + .UpdateSet((a, b) => a.Nickname == "xxx") + .ToSql(); + + fsql.Delete().Where("1=1").ExecuteAffrows(); + var longRawData = Encoding.UTF8.GetBytes(string.Join(",", Enumerable.Range(1, 2000).Select(a => "中国人"))); + fsql.Insert(new OracleLongRaw1 { data = longRawData }).NoneParameter(false).ExecuteAffrows(); + fsql.Insert(new OracleLongRaw1 { data = longRawData }).NoneParameter(true).ExecuteAffrows(); + var longRaw1 = fsql.Select().ToList(); + + MarketingRestrictions restrictions = new MarketingRestrictions(); + + if (restrictions.Id == Guid.Empty) + { + restrictions.CreatedBy = 100; + } + else + { + restrictions.UpdatedBy = 100; + restrictions.UpdatedTime = DateTime.Now; + } + + int ret = fsql.InsertOrUpdate() + .SetSource(restrictions) + .UpdateColumns(r => new { + r.Describe, + r.IsLimitUsePoints, + r.Status, + r.StartTime, + r.EndTime, + r.UpdatedBy, + r.UpdatedTime + }) + .ExecuteAffrows(); + + + var query2222 = fsql.Select() + .AsTable((t, o) => string.Format(o, "hash2")) + .Where(p => p.Name.Contains("search")) + .GroupBy(a => new { a.ClassId }) + .WithTempQuery(a => a.Key); +var sql11111 = fsql.Select() + .AsTable((t, o) => string.Format(o, "hash1")) + .Where(s => query2222 + .ToList(p => p.ClassId) + .Contains(s.Id)) + .ToSql(s => new + { + s.Id, + s.Name, + }); + + var isusers01 = fsql.Select() + .Where(e => e.Property("项目执行情况") == "结题") + .GroupBy(e => new { ProjectLevel = e.Property("项目级别") }) + .ToSql(e => new + { + e.Key.ProjectLevel, + Test = e.Value.Group.Property("批准经费总额(万元)"), + }); + isusers01 = fsql.Select() + .Where(e => e.Property("项目执行情况") == "结题") + .GroupBy(e => new { ProjectLevel = e.Property("项目级别") }) + .WithTempQuery(e => new + { + e.Key.ProjectLevel, + Test = e.Value.Group.Property("批准经费总额(万元)"), + }) + .ToSql(); + + var bulkUsers = new[] { + new IdentityUser1 { Nickname = "nickname11", Username = "username11" }, + new IdentityUser1 { Nickname = "nickname12", Username = "username12" }, + new IdentityUser1 { Nickname = "nickname13", Username = "username13" }, + + new IdentityUser1 { Nickname = "nickname21", Username = "username21" }, + new IdentityUser1 { Nickname = "nickname22", Username = "username22" }, + new IdentityUser1 { Nickname = "nickname23", Username = "username23" } + }; + fsql.Insert(bulkUsers).NoneParameter().ExecuteAffrows(); + fsql.Insert(bulkUsers).IgnoreInsertValueSql(a => a.Nickname).NoneParameter().ExecuteAffrows(); + bulkUsers = fsql.Select().OrderByDescending(a => a.Id).Limit(3).ToList().ToArray(); + bulkUsers[0].Nickname += "_bulkupdate"; + bulkUsers[1].Nickname += "_bulkupdate"; + bulkUsers[2].Nickname += "_bulkupdate"; + fsql.Update().SetSource(bulkUsers).ExecuteSqlBulkCopy(); + + + var objtsql1 = fsql.Select().WithSql("select * from user1").ToList(); + var objtsql2 = fsql.Select().WithSql("select * from user1").ToList(); + + + var usergroupRepository = fsql.GetAggregateRootRepository(); usergroupRepository.Delete(a => true); usergroupRepository.Insert(new[]{ diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 13464ef2..9dd32b35 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1073,6 +1073,82 @@ + + + 动态创建实体类型 + + + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性默认值 + 属性标记的特性-支持多个 + + + + + 配置父类 + + 父类类型 + + + + + Override属性 + + + + + + Emit动态创建出Class - Type + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -5710,6 +5786,28 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 + + + 动态构建Class Type + + + + + + 根据字典,创建 table 对应的实体对象 + + + + + + + + 根据实体对象,创建 table 对应的字典 + + + + + C#: that >= between && that <= and diff --git a/FreeSql/Internal/CommonProvider/DeleteProvider.cs b/FreeSql/Internal/CommonProvider/DeleteProvider.cs index 52279892..a0b8c090 100644 --- a/FreeSql/Internal/CommonProvider/DeleteProvider.cs +++ b/FreeSql/Internal/CommonProvider/DeleteProvider.cs @@ -196,7 +196,7 @@ namespace FreeSql.Internal.CommonProvider } var sb = new StringBuilder(); - if (_table.AsTableImpl != null && _tableRule != null && string.IsNullOrWhiteSpace(_tableRule(_table.DbName)) == true) + if (_table.AsTableImpl != null && string.IsNullOrWhiteSpace(_tableRule?.Invoke(_table.DbName)) == true) { var oldTableRule = _tableRule; var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils); @@ -231,7 +231,7 @@ namespace FreeSql.Internal.CommonProvider } var sb = new StringBuilder(); - if (_table.AsTableImpl != null && _tableRule != null && string.IsNullOrWhiteSpace(_tableRule(_table.DbName)) == true) + if (_table.AsTableImpl != null && string.IsNullOrWhiteSpace(_tableRule?.Invoke(_table.DbName)) == true) { var oldTableRule = _tableRule; var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils); diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 29dfb2aa..ec46e67f 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -1008,7 +1008,7 @@ namespace FreeSql.Internal.CommonProvider ToSqlWhere(newwhere); var sb = new StringBuilder(); - if (_table.AsTableImpl != null && _tableRule != null && string.IsNullOrWhiteSpace(_tableRule(_table.DbName)) == true) + if (_table.AsTableImpl != null && string.IsNullOrWhiteSpace(_tableRule?.Invoke(_table.DbName)) == true) { var oldTableRule = _tableRule; var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils); @@ -1042,7 +1042,7 @@ namespace FreeSql.Internal.CommonProvider ToSqlWhere(newwhere); var sb = new StringBuilder(); - if (_table.AsTableImpl != null && _tableRule != null && string.IsNullOrWhiteSpace(_tableRule(_table.DbName)) == true) + if (_table.AsTableImpl != null && string.IsNullOrWhiteSpace(_tableRule?.Invoke(_table.DbName)) == true) { var oldTableRule = _tableRule; var names = _table.AsTableImpl.GetTableNamesBySqlWhere(newwhere.ToString(), _params, new SelectTableInfo { Table = _table }, _commonUtils); From 55dc1f761a8850ba52872faf9a0bdbcf4df395b2 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 6 Jun 2023 11:30:53 +0800 Subject: [PATCH 58/58] v3.2.697 #1527 --- Directory.Build.props | 2 +- .../FreeSql.Extensions.AggregateRoot.csproj | 2 +- .../FreeSql.Extensions.BaseEntity.csproj | 2 +- .../FreeSql.Extensions.JsonMap.csproj | 2 +- .../FreeSql.Extensions.LazyLoading.csproj | 2 +- .../FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj | 2 +- Extensions/FreeSql.Generator/FreeSql.Generator.csproj | 2 +- FreeSql.All/FreeSql.All.csproj | 2 +- FreeSql.DbContext/FreeSql.DbContext.csproj | 2 +- FreeSql.Repository/FreeSql.Repository.csproj | 2 +- FreeSql/FreeSql.csproj | 2 +- .../FreeSql.Provider.ClickHouse.csproj | 4 ++-- .../FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj | 2 +- .../FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj | 2 +- .../FreeSql.Provider.Firebird.csproj | 2 +- .../FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj | 2 +- .../FreeSql.Provider.KingbaseES.csproj | 2 +- .../FreeSql.Provider.MsAccess.csproj | 2 +- .../FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj | 2 +- .../FreeSql.Provider.MySqlConnector.csproj | 2 +- Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj | 2 +- .../FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj | 2 +- .../FreeSql.Provider.OracleOledb.csproj | 2 +- .../FreeSql.Provider.PostgreSQL.csproj | 2 +- .../FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj | 2 +- .../FreeSql.Provider.ShenTong.csproj | 2 +- .../FreeSql.Provider.SqlServer.csproj | 2 +- .../FreeSql.Provider.SqlServerForSystem.csproj | 2 +- .../FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj | 2 +- .../FreeSql.Provider.SqliteCore.csproj | 2 +- Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj | 2 +- 31 files changed, 32 insertions(+), 32 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index bdd7c90e..ba26440d 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index e2f5439e..28b01d16 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index 20db3c8a..f7a53642 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.697-preview20230530 + 3.2.697 diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index e2af12da..3cd2d4e1 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index 1938594e..10bf3a36 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.697-preview20230530 + 3.2.697 diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index 87230cfb..510fa4e4 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 02179803..fcc0bf0a 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.697-preview20230530 + 3.2.697 diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index 58581548..87360f87 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index f8020cd7..f799fe3c 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index c8839dda..8820ef14 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 891598e0..084a4f1c 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index a52c812a..3c892ddb 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.697-preview20230530 + 3.2.697 @@ -32,7 +32,7 @@ - 4.0.1.462 + 6.6.0 diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index 036aaed4..431c4e9a 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index 9aeae760..256ba61a 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index cbd5f5e8..eb224289 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index d8d23bbe..7adaee44 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index c40d88b0..c2aef4f0 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index 66e88b20..5ea9b61a 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index 1ad72eff..58d449d8 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 350827a8..2b78c28d 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index c3b48d48..abe3f21f 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index c5f95b7e..cc6dc759 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index b1217da7..2a9e7a4c 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index 5be00f8e..8db03564 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index 324f3a8e..8deb7679 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index 8a2059ed..d17ae380 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index a2796e3c..8af7a5aa 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index 40abf26d..466a37f0 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index 5bb70b2a..d25f6394 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index 850030b0..45a8730c 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.697-preview20230530 + 3.2.697 diff --git a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj index 08d38f88..cedd9992 100644 --- a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj +++ b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.697-preview20230530 + 3.2.697