From 0991464fd054984a0c46c7f7bcd9933ef788bc09 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Fri, 15 May 2020 13:27:44 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20IUpdate.Set(a=20=3D>?= =?UTF-8?q?=20a.xx=20=3D=20null)=20=E8=A1=A8=E8=BE=BE=E5=BC=8F=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=20bug=EF=BC=9B#311?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 16 +++++ .../MySqlAdoTest.cs | 71 ++++++++++++++----- .../MySqlConnector/Curd/MySqlUpdateTest.cs | 3 + .../Dameng/Curd/DamengUpdateTest.cs | 3 + .../Default/Curd/OdbcUpdateTest.cs | 3 + .../MySql/Curd/MySqlUpdateTest.cs | 3 + .../Oracle/Curd/OracleUpdateTest.cs | 3 + .../PostgreSQL/Curd/PostgreSQLUpdateTest.cs | 3 + .../SqlServer/Curd/SqlServerUpdateTest.cs | 3 + .../Dameng/Curd/DamengUpdateTest.cs | 3 + .../MsAccess/Curd/MsAccessUpdateTest.cs | 3 + .../MySql/Curd/MySqlUpdateTest.cs | 3 + .../Oracle/Curd/OracleUpdateTest.cs | 3 + .../PostgreSQL/Curd/PostgreSQLUpdateTest.cs | 3 + .../SqlServer/Curd/SqlServerUpdateTest.cs | 3 + .../Sqlite/Curd/SqliteUpdateTest.cs | 3 + .../SelectProvider/Select0Provider.cs | 5 +- .../Internal/CommonProvider/UpdateProvider.cs | 4 +- FreeSql/Internal/UtilsExpressionTree.cs | 28 ++++---- 19 files changed, 130 insertions(+), 36 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 132d875e..4854f49c 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -125,6 +125,13 @@ 清空状态数据 + + + 根据 lambda 条件删除数据 + + + + 添加 @@ -479,5 +486,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests.PerformanceTests/MySqlAdoTest.cs b/FreeSql.Tests/FreeSql.Tests.PerformanceTests/MySqlAdoTest.cs index 147241ad..315279e9 100644 --- a/FreeSql.Tests/FreeSql.Tests.PerformanceTests/MySqlAdoTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.PerformanceTests/MySqlAdoTest.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Collections.Generic; using System.Threading.Tasks; using System.Threading; +using FreeSql.Internal; namespace FreeSql.Tests.PerformanceTest { @@ -24,7 +25,7 @@ namespace FreeSql.Tests.PerformanceTest List dplist1 = null; using (var conn = g.mysql.Ado.MasterPool.Get()) { - dplist1 = Dapper.SqlMapper.Query(conn.Value, "select * from song").ToList(); + dplist1 = Dapper.SqlMapper.Query(conn.Value, "select * from freesql_song").ToList(); } time.Stop(); sb.AppendLine($"Elapsed: {time.Elapsed}; Query Entity Counts: {dplist1.Count}; ORM: Dapper"); @@ -33,7 +34,7 @@ namespace FreeSql.Tests.PerformanceTest List<(int, string, string)> dplist2 = null; using (var conn = g.mysql.Ado.MasterPool.Get()) { - dplist2 = Dapper.SqlMapper.Query<(int, string, string)>(conn.Value, "select * from song").ToList(); + dplist2 = Dapper.SqlMapper.Query<(int, string, string)>(conn.Value, "select * from freesql_song").ToList(); } time.Stop(); sb.AppendLine($"Elapsed: {time.Elapsed}; Query Tuple Counts: {dplist2.Count}; ORM: Dapper"); @@ -42,7 +43,7 @@ namespace FreeSql.Tests.PerformanceTest List dplist3 = null; using (var conn = g.mysql.Ado.MasterPool.Get()) { - dplist3 = Dapper.SqlMapper.Query(conn.Value, "select * from song").ToList(); + dplist3 = Dapper.SqlMapper.Query(conn.Value, "select * from freesql_song").ToList(); } time.Stop(); sb.AppendLine($"Elapsed: {time.Elapsed}; Query Dynamic Counts: {dplist3.Count}; ORM: Dapper"); @@ -50,15 +51,15 @@ namespace FreeSql.Tests.PerformanceTest - var t31 = g.mysql.Ado.Query("select * from song limit 1"); + var t31 = g.mysql.Ado.Query("select * from freesql_song limit 1"); time.Restart(); - var t3 = g.mysql.Ado.Query("select * from song"); + var t3 = g.mysql.Ado.Query("select * from freesql_song"); time.Stop(); sb.AppendLine($"Elapsed: {time.Elapsed}; Query Entity Counts: {t3.Count}; ORM: FreeSql*"); time.Restart(); - var t4 = g.mysql.Ado.Query<(int, string, string)>("select * from song"); + var t4 = g.mysql.Ado.Query<(int, string, string)>("select * from freesql_song"); time.Stop(); sb.AppendLine($"Elapsed: {time.Elapsed}; Query Tuple Counts: {t4.Count}; ORM: FreeSql*"); @@ -68,7 +69,7 @@ namespace FreeSql.Tests.PerformanceTest sb.AppendLine($"Elapsed: {time.Elapsed}; Query ToList Counts: {t41.Count}; ORM: FreeSql*"); time.Restart(); - var t5 = g.mysql.Ado.Query("select * from song"); + var t5 = g.mysql.Ado.Query("select * from freesql_song"); time.Stop(); sb.AppendLine($"Elapsed: {time.Elapsed}; Query Dynamic Counts: {t3.Count}; ORM: FreeSql*"); @@ -86,7 +87,7 @@ namespace FreeSql.Tests.PerformanceTest { using (var conn = g.mysql.Ado.MasterPool.Get()) { - dplist1.AddRange(Dapper.SqlMapper.Query(conn.Value, "select * from song limit 10").ToList()); + dplist1.AddRange(Dapper.SqlMapper.Query(conn.Value, "select * from freesql_song limit 10").ToList()); } } time.Stop(); @@ -98,7 +99,7 @@ namespace FreeSql.Tests.PerformanceTest { using (var conn = g.mysql.Ado.MasterPool.Get()) { - dplist2.AddRange(Dapper.SqlMapper.Query<(int, string, string)>(conn.Value, "select * from song limit 10").ToList()); + dplist2.AddRange(Dapper.SqlMapper.Query<(int, string, string)>(conn.Value, "select * from freesql_song limit 10").ToList()); } } time.Stop(); @@ -110,7 +111,7 @@ namespace FreeSql.Tests.PerformanceTest { using (var conn = g.mysql.Ado.MasterPool.Get()) { - dplist3.AddRange(Dapper.SqlMapper.Query(conn.Value, "select * from song limit 10").ToList()); + dplist3.AddRange(Dapper.SqlMapper.Query(conn.Value, "select * from freesql_song limit 10").ToList()); } } time.Stop(); @@ -123,7 +124,7 @@ namespace FreeSql.Tests.PerformanceTest List t3 = new List(); for (var a = 0; a < 10000; a++) { - t3.AddRange(g.mysql.Ado.Query("select * from song limit 10")); + t3.AddRange(g.mysql.Ado.Query("select * from freesql_song limit 10")); } time.Stop(); sb.AppendLine($"Elapsed: {time.Elapsed}; Query Entity Counts: {t3.Count}; ORM: FreeSql*"); @@ -132,7 +133,7 @@ namespace FreeSql.Tests.PerformanceTest List<(int, string, string)> t4 = new List<(int, string, string)>(); for (var a = 0; a < 10000; a++) { - t4.AddRange(g.mysql.Ado.Query<(int, string, string)>("select * from song limit 10")); + t4.AddRange(g.mysql.Ado.Query<(int, string, string)>("select * from freesql_song limit 10")); } time.Stop(); sb.AppendLine($"Elapsed: {time.Elapsed}; Query Tuple Counts: {t4.Count}; ORM: FreeSql*"); @@ -141,7 +142,7 @@ namespace FreeSql.Tests.PerformanceTest List t5 = new List(); for (var a = 0; a < 10000; a++) { - t5.AddRange(g.mysql.Ado.Query("select * from song limit 10")); + t5.AddRange(g.mysql.Ado.Query("select * from freesql_song limit 10")); } time.Stop(); sb.AppendLine($"Elapsed: {time.Elapsed}; Query Dynamic Counts: {t3.Count}; ORM: FreeSql*"); @@ -155,17 +156,53 @@ namespace FreeSql.Tests.PerformanceTest var time = new Stopwatch(); //var t31 = g.mysql.Select().ToList(); + g.mysql.Select().First(); time.Restart(); var t3 = g.mysql.Select().ToList(); time.Stop(); sb.AppendLine($"Elapsed: {time.Elapsed}; ToList Entity Counts: {t3.Count}; ORM: FreeSql*"); + time.Restart(); + var adoarr1 = g.mysql.Ado.ExecuteArray("select * from freesql_song"); + time.Stop(); + sb.AppendLine($"Elapsed: {time.Elapsed}; ExecuteArray Entity Counts: {adoarr1.Length}; ORM: FreeSql ExecuteArray*"); + + time.Restart(); + var adolist1 = new List(); + g.mysql.Ado.ExecuteReader(dr => + { + var xim = new xxx(); + var val1 = dr.GetValue(0); + if (val1 is int) ; + val1 = int.Parse(string.Format("{0}", val1)); + xim.Id = (int)val1; + val1 = dr.GetValue(1); + if (val1 is DateTime) ; + val1 = (DateTime)val1; + xim.Create_time = (DateTime)val1; + val1 = dr.GetValue(2); + if (val1 is int) ; + val1 = int.Parse(string.Format("{0}", val1)) != 0; + xim.Is_deleted = (bool)val1; + val1 = dr.GetValue(3); + if (val1 is string) ; + val1 = (string)val1; + xim.Title = (string)val1; + val1 = dr.GetValue(4); + if (val1 is string) ; + val1 = (string)val1; + xim.Title = (string)val1; + adolist1.Add(xim); + }, "select * from freesql_song"); + time.Stop(); + sb.AppendLine($"Elapsed: {time.Elapsed}; ExecuteReader Entity Counts: {adolist1.Count}; ORM: FreeSql ExecuteReader*"); + time.Restart(); List dplist1 = null; using (var conn = g.mysql.Ado.MasterPool.Get()) { - dplist1 = Dapper.SqlMapper.Query(conn.Value, "select * from song").ToList(); + dplist1 = Dapper.SqlMapper.Query(conn.Value, "select * from freesql_song").ToList(); } time.Stop(); sb.AppendLine($"Elapsed: {time.Elapsed}; Query Entity Counts: {dplist1.Count}; ORM: Dapper"); @@ -201,7 +238,7 @@ namespace FreeSql.Tests.PerformanceTest { using (var conn = g.mysql.Ado.MasterPool.Get()) { - dplist1.AddRange(Dapper.SqlMapper.Query(conn.Value, "select * from song limit 50").ToList()); + dplist1.AddRange(Dapper.SqlMapper.Query(conn.Value, "select * from freesql_song limit 50").ToList()); } } Interlocked.Add(ref dplist1Count, dplist1.Count); @@ -211,12 +248,12 @@ namespace FreeSql.Tests.PerformanceTest sb.AppendLine($"Elapsed: {time.Elapsed}; Query Entity Counts: {dplist1Count}; ORM: Dapper"); } - [Table(Name = "song")] + [Table(Name = "freesql_song")] class xxx { public int Id { get; set; } public string Title { get; set; } - //public string Url { get; set; } + public string Url { get; set; } public DateTime Create_time { get; set; } public bool Is_deleted { get; set; } } diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlUpdateTest.cs index 441fdfd5..69bbb16c 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlUpdateTest.cs @@ -148,6 +148,9 @@ namespace FreeSql.Tests.MySqlConnector sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); Assert.Equal("UPDATE `tb_topic` SET `Id` = 10 WHERE (`Id` = 1)", sql); + sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); + Assert.Equal("UPDATE `tb_topic` SET `Clicks` = NULL WHERE (`Id` = 1)", sql); + var id = g.mysql.Insert().AppendData(new TestEnumUpdateTb { type = TestEnumUpdateTbType.sum211 }).ExecuteIdentity(); Assert.True(id > 0); sql = g.mysql.Update().Where(a => a.id == id).Set(a => a.type, TestEnumUpdateTbType.biggit).ToSql().Replace("\r\n", ""); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengUpdateTest.cs index eb9c649d..8d77def2 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengUpdateTest.cs @@ -115,6 +115,9 @@ namespace FreeSql.Tests.Odbc.Dameng sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); Assert.Equal("UPDATE \"TB_TOPIC\" SET \"ID\" = 10 WHERE (\"ID\" = 1)", sql); + + sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); + Assert.Equal("UPDATE \"TB_TOPIC\" SET \"CLICKS\" = NULL WHERE (\"ID\" = 1)", sql); } [Fact] public void SetRaw() diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcUpdateTest.cs index e70ff06e..0754dca8 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcUpdateTest.cs @@ -107,6 +107,9 @@ namespace FreeSql.Tests.Odbc.Default sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); Assert.Equal("UPDATE [tb_topic] SET [Id] = 10 WHERE ([Id] = 1)", sql); + + sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); + Assert.Equal("UPDATE [tb_topic] SET [Clicks] = NULL WHERE ([Id] = 1)", sql); } [Fact] public void SetRaw() diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlUpdateTest.cs index ac8f603f..5c25af37 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlUpdateTest.cs @@ -148,6 +148,9 @@ namespace FreeSql.Tests.Odbc.MySql sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); Assert.Equal("UPDATE `tb_topic` SET `Id` = 10 WHERE (`Id` = 1)", sql); + sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); + Assert.Equal("UPDATE `tb_topic` SET `Clicks` = NULL WHERE (`Id` = 1)", sql); + var id = g.mysql.Insert().AppendData(new TestEnumUpdateTb { type = TestEnumUpdateTbType.sum211 }).ExecuteIdentity(); Assert.True(id > 0); sql = g.mysql.Update().Where(a => a.id == id).Set(a => a.type, TestEnumUpdateTbType.biggit).ToSql().Replace("\r\n", ""); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleUpdateTest.cs index a4ae7706..f98c637a 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleUpdateTest.cs @@ -105,6 +105,9 @@ namespace FreeSql.Tests.Odbc.Oracle sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); Assert.Equal("UPDATE \"TB_TOPIC\" SET \"ID\" = 10 WHERE (\"ID\" = 1)", sql); + + sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); + Assert.Equal("UPDATE \"TB_TOPIC\" SET \"CLICKS\" = NULL WHERE (\"ID\" = 1)", sql); } [Fact] public void SetRaw() diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLUpdateTest.cs index 854481d5..fab9e9a8 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLUpdateTest.cs @@ -106,6 +106,9 @@ namespace FreeSql.Tests.Odbc.PostgreSQL sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); Assert.Equal("UPDATE \"tb_topic\" SET \"id\" = 10 WHERE (\"id\" = 1)", sql); + + sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); + Assert.Equal("UPDATE \"tb_topic\" SET \"clicks\" = NULL WHERE (\"id\" = 1)", sql); } [Fact] public void SetRaw() diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerUpdateTest.cs index 1ea9b81a..882a52fa 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerUpdateTest.cs @@ -108,6 +108,9 @@ namespace FreeSql.Tests.Odbc.SqlServer sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); Assert.Equal("UPDATE [tb_topic] SET [Id] = 10 WHERE ([Id] = 1)", sql); + + sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); + Assert.Equal("UPDATE [tb_topic] SET [Clicks] = NULL WHERE ([Id] = 1)", sql); } [Fact] public void SetRaw() diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengUpdateTest.cs index d9160ab9..d1285cbb 100644 --- a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengUpdateTest.cs @@ -115,6 +115,9 @@ namespace FreeSql.Tests.Dameng sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); Assert.Equal("UPDATE \"TB_TOPIC\" SET \"ID\" = 10 WHERE (\"ID\" = 1)", sql); + + sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); + Assert.Equal("UPDATE \"TB_TOPIC\" SET \"CLICKS\" = NULL WHERE (\"ID\" = 1)", sql); } [Fact] public void SetRaw() diff --git a/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessUpdateTest.cs index 4b6c188d..87a4ffee 100644 --- a/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessUpdateTest.cs @@ -117,6 +117,9 @@ namespace FreeSql.Tests.MsAccess sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); Assert.Equal("UPDATE [tb_topic] SET [Id] = 10 WHERE ([Id] = 1)", sql); + + sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); + Assert.Equal("UPDATE [tb_topic] SET [Clicks] = NULL WHERE ([Id] = 1)", sql); } [Fact] public void SetRaw() diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlUpdateTest.cs index b216d48b..0d3e1218 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlUpdateTest.cs @@ -149,6 +149,9 @@ namespace FreeSql.Tests.MySql sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); Assert.Equal("UPDATE `tb_topic` SET `Id` = 10 WHERE (`Id` = 1)", sql); + sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); + Assert.Equal("UPDATE `tb_topic` SET `Clicks` = NULL WHERE (`Id` = 1)", sql); + var id = g.mysql.Insert().AppendData(new TestEnumUpdateTb { type = TestEnumUpdateTbType.sum211 }).ExecuteIdentity(); Assert.True(id > 0); sql = g.mysql.Update().Where(a => a.id == id).Set(a => a.type, TestEnumUpdateTbType.biggit).ToSql().Replace("\r\n", ""); diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleUpdateTest.cs index 67c163f2..5b35fe60 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleUpdateTest.cs @@ -105,6 +105,9 @@ namespace FreeSql.Tests.Oracle sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); Assert.Equal("UPDATE \"TB_TOPIC\" SET \"ID\" = 10 WHERE (\"ID\" = 1)", sql); + + sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); + Assert.Equal("UPDATE \"TB_TOPIC\" SET \"CLICKS\" = NULL WHERE (\"ID\" = 1)", sql); } [Fact] public void SetRaw() diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLUpdateTest.cs index 5b574ff6..602195ff 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLUpdateTest.cs @@ -107,6 +107,9 @@ namespace FreeSql.Tests.PostgreSQL sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); Assert.Equal("UPDATE \"tb_topic\" SET \"id\" = 10 WHERE (\"id\" = 1)", sql); + + sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); + Assert.Equal("UPDATE \"tb_topic\" SET \"clicks\" = NULL WHERE (\"id\" = 1)", sql); } [Fact] public void SetRaw() diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerUpdateTest.cs index 38e8a77a..0bbb6a58 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerUpdateTest.cs @@ -118,6 +118,9 @@ namespace FreeSql.Tests.SqlServer sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); Assert.Equal("UPDATE [tb_topic] SET [Id] = 10 WHERE ([Id] = 1)", sql); + + sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); + Assert.Equal("UPDATE [tb_topic] SET [Clicks] = NULL WHERE ([Id] = 1)", sql); } [Fact] public void SetRaw() diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteUpdateTest.cs index 7089325b..577637c5 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteUpdateTest.cs @@ -124,6 +124,9 @@ namespace FreeSql.Tests.Sqlite sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); Assert.Equal("UPDATE \"tb_topic\" SET \"Id\" = 10 WHERE (\"Id\" = 1)", sql); + + sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); + Assert.Equal("UPDATE \"tb_topic\" SET \"Clicks\" = NULL WHERE (\"Id\" = 1)", sql); } [Fact] public void SetRaw() diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 42af114d..9bbe5cea 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -1063,10 +1063,7 @@ namespace FreeSql.Internal.CommonProvider { var firstTb = _tables[0]; var firstTbs = _tables.Where(a => a.AliasInit == field[0]).ToArray(); - if (firstTbs.Length == 1) - { - firstTb = firstTbs[0]; - } + if (firstTbs.Length == 1) firstTb = firstTbs[0]; firstTb.Parameter = Expression.Parameter(firstTb.Table.Type, firstTb.Alias); var currentType = firstTb.Table.Type; diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 1a7cf8ab..e6307337 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -409,7 +409,9 @@ namespace FreeSql.Internal.CommonProvider { case ExpressionType.Equal: var equalBinaryExp = body as BinaryExpression; - _set.Append(", ").Append(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, body, null, null)); + var eqval = _commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, body, null, null); + if (eqval.EndsWith(" IS NULL")) eqval = $"{eqval.Remove(eqval.Length - 10)} = NULL"; //issues/311 + _set.Append(", ").Append(eqval); return this; case ExpressionType.MemberInit: var initExp = body as MemberInitExpression; diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 3d7401d3..7bbd8a63 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -1363,10 +1363,10 @@ namespace FreeSql.Internal Expression.Block( Expression.IfThen( Expression.LessThan(dataIndexExp, rowLenExp), - Expression.Return(returnTarget, Expression.New(RowInfo.Constructor, - GetDataReaderValueBlockExpression(type, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp })), - //Expression.Call(MethodGetDataReaderValue, new Expression[] { typeExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp }) }), - Expression.Add(dataIndexExp, Expression.Constant(1)))) + Expression.Return(returnTarget, Expression.New(RowInfo.Constructor, + GetDataReaderValueBlockExpression(type, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp })), + //Expression.Call(MethodGetDataReaderValue, new Expression[] { typeExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp }) }), + Expression.Add(dataIndexExp, Expression.Constant(1)))) ), Expression.Label(returnTarget, Expression.Default(typeof(RowInfo))) ), new[] { typeExp, indexesExp, rowExp, dataIndexExp, commonUtilExp }).Compile(); @@ -1442,7 +1442,7 @@ namespace FreeSql.Internal Expression.IfThen( Expression.AndAlso( Expression.IsFalse(readpknullExp), - Expression.Or( + Expression.OrElse( Expression.Equal(readpkvalExp, Expression.Constant(DBNull.Value)), Expression.Equal(readpkvalExp, Expression.Constant(null)) ) @@ -1550,7 +1550,7 @@ namespace FreeSql.Internal Expression.IfThen( Expression.AndAlso( Expression.IsFalse(readpknullExp), - Expression.Or( + Expression.OrElse( Expression.Equal(readpkvalExp, Expression.Constant(DBNull.Value)), Expression.Equal(readpkvalExp, Expression.Constant(null)) ) @@ -1718,7 +1718,7 @@ namespace FreeSql.Internal Expression.TypeEqual(valueExp, typeof(string)), Expression.Return(returnTarget, Expression.Call(Expression.Constant(DefaultEncoding), MethodEncodingGetBytes, Expression.Convert(valueExp, typeof(string)))), Expression.IfThenElse( - Expression.Or(Expression.TypeEqual(valueExp, typeof(Guid)), Expression.TypeEqual(valueExp, typeof(Guid?))), + Expression.OrElse(Expression.TypeEqual(valueExp, typeof(Guid)), Expression.TypeEqual(valueExp, typeof(Guid?))), Expression.Return(returnTarget, Expression.Call(MethodGuidToBytes, Expression.Convert(valueExp, typeof(Guid)))), Expression.Return(returnTarget, Expression.Call(Expression.Constant(DefaultEncoding), MethodEncodingGetBytes, Expression.Call(MethodToString, valueExp))) ) @@ -1969,11 +1969,11 @@ namespace FreeSql.Internal break; case "System.Boolean": tryparseBooleanExp = Expression.Return(returnTarget, - Expression.Convert( - Expression.Not( - Expression.Or( - Expression.Equal(Expression.Convert(valueExp, typeof(string)), Expression.Constant("False")), - Expression.Or( + Expression.Convert( + Expression.Not( + Expression.OrElse( + Expression.Equal(Expression.Convert(valueExp, typeof(string)), Expression.Constant("False")), + Expression.OrElse( Expression.Equal(Expression.Convert(valueExp, typeof(string)), Expression.Constant("false")), Expression.Equal(Expression.Convert(valueExp, typeof(string)), Expression.Constant("0"))))), typeof(object)) @@ -2027,7 +2027,7 @@ namespace FreeSql.Internal Expression.IfThenElse( Expression.TypeEqual(valueExp, typeof(byte[])), Expression.IfThenElse( - Expression.Or(Expression.Equal(Expression.Constant(type), Expression.Constant(typeof(Guid))), Expression.Equal(Expression.Constant(type), Expression.Constant(typeof(Guid?)))), + Expression.OrElse(Expression.Equal(Expression.Constant(type), Expression.Constant(typeof(Guid))), Expression.Equal(Expression.Constant(type), Expression.Constant(typeof(Guid?)))), Expression.Return(returnTarget, Expression.Convert(Expression.Call(MethodBytesToGuid, Expression.Convert(valueExp, typeof(byte[]))), typeof(object))), Expression.IfThenElse( Expression.Equal(Expression.Constant(type), Expression.Constant(typeof(string))), @@ -2047,7 +2047,7 @@ namespace FreeSql.Internal new[] { valueExp }, Expression.Assign(valueExp, Expression.Convert(value, typeof(object))), Expression.IfThenElse( - Expression.Or( + Expression.OrElse( Expression.Equal(valueExp, Expression.Constant(null)), Expression.Equal(valueExp, Expression.Constant(DBNull.Value)) ),