From 99f0dd73915473e5d9bf3f0ba98da6627500392a Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Fri, 22 May 2020 18:20:28 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20IUpdate.SetSourceIgnor?= =?UTF-8?q?e=20=E6=96=B9=E6=B3=95=EF=BC=8C=E5=8F=AF=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=BF=BD=E7=95=A5=20null=20=E5=B1=9E=E6=80=A7=E7=9A=84?= =?UTF-8?q?=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 | 2 +- .../MySqlConnector/Curd/MySqlUpdateTest.cs | 14 +++++++++++ .../Dameng/Curd/DamengUpdateTest.cs | 14 +++++++++++ .../Default/Curd/OdbcUpdateTest.cs | 14 +++++++++++ .../MySql/Curd/MySqlUpdateTest.cs | 14 +++++++++++ .../Oracle/Curd/OracleUpdateTest.cs | 14 +++++++++++ .../PostgreSQL/Curd/PostgreSQLUpdateTest.cs | 14 +++++++++++ .../SqlServer/Curd/SqlServerUpdateTest.cs | 14 +++++++++++ .../Dameng/Curd/DamengUpdateTest.cs | 14 +++++++++++ .../MsAccess/Curd/MsAccessUpdateTest.cs | 14 +++++++++++ .../MySql/Curd/MySqlUpdateTest.cs | 14 +++++++++++ .../Oracle/Curd/OracleUpdateTest.cs | 14 +++++++++++ .../PostgreSQL/Curd/PostgreSQLUpdateTest.cs | 15 +++++++++++- .../SqlServer/Curd/SqlServerUpdateTest.cs | 15 +++++++++++- .../Sqlite/Curd/SqliteUpdateTest.cs | 14 +++++++++++ FreeSql/FreeSql.xml | 22 ++++++++++++++---- FreeSql/FreeSqlBuilder.cs | 10 ++------ FreeSql/Interface/Curd/IUpdate.cs | 23 +++++++++++++++---- .../Internal/CommonProvider/UpdateProvider.cs | 12 +++++++++- 19 files changed, 246 insertions(+), 21 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 256a8653..385e38a5 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -72,7 +72,7 @@ namespace base_entity //.UseConnectionString(FreeSql.DataType.OdbcDameng, "Driver={DM8 ODBC DRIVER};Server=127.0.0.1:5236;Persist Security Info=False;Trusted_Connection=Yes;UID=USER1;PWD=123456789") - .UseMonitorCommand(cmd => Console.Write(cmd.CommandText)) + .UseMonitorCommand(cmd => Console.WriteLine(cmd.CommandText)) .UseLazyLoading(true) .Build(); BaseEntity.Initialization(fsql, () => _asyncUow.Value); 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 69bbb16c..646a508b 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlUpdateTest.cs @@ -93,6 +93,20 @@ namespace FreeSql.Tests.MySqlConnector public string xx { get; set; } } [Fact] + public void SetSourceIgnore() + { + Assert.Equal("UPDATE `tssi01` SET `tint` = 10 WHERE (`id` = '00000000-0000-0000-0000-000000000000')", + g.mysql.Update().NoneParameter() + .SetSourceIgnore(new tssi01 { id = Guid.Empty, tint = 10 }, col => col == null).ToSql().Replace("\r\n", "")); + } + public class tssi01 + { + [Column(CanUpdate = false)] + public Guid id { get; set; } + public int tint { get; set; } + public string title { get; set; } + } + [Fact] public void IgnoreColumns() { var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).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 8d77def2..8375a89b 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengUpdateTest.cs @@ -73,6 +73,20 @@ namespace FreeSql.Tests.Odbc.Dameng public string xx { get; set; } } [Fact] + public void SetSourceIgnore() + { + Assert.Equal("UPDATE \"TSSI01\" SET \"TINT\" = 10 WHERE (\"ID\" = '00000000-0000-0000-0000-000000000000')", + g.dameng.Update().NoneParameter() + .SetSourceIgnore(new tssi01 { id = Guid.Empty, tint = 10 }, col => col == null).ToSql().Replace("\r\n", "")); + } + public class tssi01 + { + [Column(CanUpdate = false)] + public Guid id { get; set; } + public int tint { get; set; } + public string title { get; set; } + } + [Fact] public void IgnoreColumns() { var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", ""); 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 0754dca8..77a5e25e 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcUpdateTest.cs @@ -65,6 +65,20 @@ namespace FreeSql.Tests.Odbc.Default public string xx { get; set; } } [Fact] + public void SetSourceIgnore() + { + Assert.Equal("UPDATE [tssi01] SET [tint] = 10 WHERE ([id] = '00000000-0000-0000-0000-000000000000')", + g.odbc.Update().NoneParameter() + .SetSourceIgnore(new tssi01 { id = Guid.Empty, tint = 10 }, col => col == null).ToSql().Replace("\r\n", "")); + } + public class tssi01 + { + [Column(CanUpdate = false)] + public Guid id { get; set; } + public int tint { get; set; } + public string title { get; set; } + } + [Fact] public void IgnoreColumns() { var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime, a.TypeGuid }).ToSql().Replace("\r\n", ""); 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 5c25af37..0ea494df 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlUpdateTest.cs @@ -93,6 +93,20 @@ namespace FreeSql.Tests.Odbc.MySql public string xx { get; set; } } [Fact] + public void SetSourceIgnore() + { + Assert.Equal("UPDATE `tssi01` SET `tint` = 10 WHERE (`id` = '00000000-0000-0000-0000-000000000000')", + g.mysql.Update().NoneParameter() + .SetSourceIgnore(new tssi01 { id = Guid.Empty, tint = 10 }, col => col == null).ToSql().Replace("\r\n", "")); + } + public class tssi01 + { + [Column(CanUpdate = false)] + public Guid id { get; set; } + public int tint { get; set; } + public string title { get; set; } + } + [Fact] public void IgnoreColumns() { var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).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 f98c637a..f71c827d 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleUpdateTest.cs @@ -63,6 +63,20 @@ namespace FreeSql.Tests.Odbc.Oracle public string xx { get; set; } } [Fact] + public void SetSourceIgnore() + { + Assert.Equal("UPDATE \"TSSI01\" SET \"TINT\" = 10 WHERE (\"ID\" = '00000000-0000-0000-0000-000000000000')", + g.oracle.Update().NoneParameter() + .SetSourceIgnore(new tssi01 { id = Guid.Empty, tint = 10 }, col => col == null).ToSql().Replace("\r\n", "")); + } + public class tssi01 + { + [Column(CanUpdate = false)] + public Guid id { get; set; } + public int tint { get; set; } + public string title { get; set; } + } + [Fact] public void IgnoreColumns() { var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", ""); 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 fab9e9a8..a474aea2 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLUpdateTest.cs @@ -64,6 +64,20 @@ namespace FreeSql.Tests.Odbc.PostgreSQL public string xx { get; set; } } [Fact] + public void SetSourceIgnore() + { + Assert.Equal("UPDATE \"tssi01\" SET \"tint\" = 10 WHERE (\"id\" = '00000000-0000-0000-0000-000000000000')", + g.pgsql.Update().NoneParameter() + .SetSourceIgnore(new tssi01 { id = Guid.Empty, tint = 10 }, col => col == null).ToSql().Replace("\r\n", "")); + } + public class tssi01 + { + [Column(CanUpdate = false)] + public Guid id { get; set; } + public int tint { get; set; } + public string title { get; set; } + } + [Fact] public void IgnoreColumns() { var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", ""); 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 882a52fa..237b8064 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerUpdateTest.cs @@ -66,6 +66,20 @@ namespace FreeSql.Tests.Odbc.SqlServer public string xx { get; set; } } [Fact] + public void SetSourceIgnore() + { + Assert.Equal("UPDATE [tssi01] SET [tint] = 10 WHERE ([id] = '00000000-0000-0000-0000-000000000000')", + g.sqlserver.Update().NoneParameter() + .SetSourceIgnore(new tssi01 { id = Guid.Empty, tint = 10 }, col => col == null).ToSql().Replace("\r\n", "")); + } + public class tssi01 + { + [Column(CanUpdate = false)] + public Guid id { get; set; } + public int tint { get; set; } + public string title { get; set; } + } + [Fact] public void IgnoreColumns() { var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime, a.TypeGuid }).ToSql().Replace("\r\n", ""); diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengUpdateTest.cs index d1285cbb..06c53408 100644 --- a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengUpdateTest.cs @@ -73,6 +73,20 @@ namespace FreeSql.Tests.Dameng public string xx { get; set; } } [Fact] + public void SetSourceIgnore() + { + Assert.Equal("UPDATE \"TSSI01\" SET \"TINT\" = 10 WHERE (\"ID\" = '00000000-0000-0000-0000-000000000000')", + g.dameng.Update().NoneParameter() + .SetSourceIgnore(new tssi01 { id = Guid.Empty, tint = 10 }, col => col == null).ToSql().Replace("\r\n", "")); + } + public class tssi01 + { + [Column(CanUpdate = false)] + public Guid id { get; set; } + public int tint { get; set; } + public string title { get; set; } + } + [Fact] public void IgnoreColumns() { var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", ""); diff --git a/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessUpdateTest.cs index 87a4ffee..d493de00 100644 --- a/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessUpdateTest.cs @@ -75,6 +75,20 @@ namespace FreeSql.Tests.MsAccess public string xx { get; set; } } [Fact] + public void SetSourceIgnore() + { + Assert.Equal("UPDATE [tssi01] SET [tint] = 10 WHERE ([id] = '00000000-0000-0000-0000-000000000000')", + g.msaccess.Update().NoneParameter() + .SetSourceIgnore(new tssi01 { id = Guid.Empty, tint = 10 }, col => col == null).ToSql().Replace("\r\n", "")); + } + public class tssi01 + { + [Column(CanUpdate = false)] + public Guid id { get; set; } + public int tint { get; set; } + public string title { get; set; } + } + [Fact] public void IgnoreColumns() { var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime, a.TypeGuid }).ToSql().Replace("\r\n", ""); diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlUpdateTest.cs index 0d3e1218..5ff9a1b3 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlUpdateTest.cs @@ -94,6 +94,20 @@ namespace FreeSql.Tests.MySql public string xx { get; set; } } [Fact] + public void SetSourceIgnore() + { + Assert.Equal("UPDATE `tssi01` SET `tint` = 10 WHERE (`id` = '00000000-0000-0000-0000-000000000000')", + g.mysql.Update().NoneParameter() + .SetSourceIgnore(new tssi01 { id = Guid.Empty, tint = 10 }, col => col == null).ToSql().Replace("\r\n", "")); + } + public class tssi01 + { + [Column(CanUpdate = false)] + public Guid id { get; set; } + public int tint { get; set; } + public string title { get; set; } + } + [Fact] public void IgnoreColumns() { var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).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 5b35fe60..13abb3ef 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleUpdateTest.cs @@ -63,6 +63,20 @@ namespace FreeSql.Tests.Oracle public string xx { get; set; } } [Fact] + public void SetSourceIgnore() + { + Assert.Equal("UPDATE \"TSSI01\" SET \"TINT\" = 10 WHERE (\"ID\" = '00000000-0000-0000-0000-000000000000')", + g.oracle.Update().NoneParameter() + .SetSourceIgnore(new tssi01 { id = Guid.Empty, tint = 10 }, col => col == null).ToSql().Replace("\r\n", "")); + } + public class tssi01 + { + [Column(CanUpdate = false)] + public Guid id { get; set; } + public int tint { get; set; } + public string title { get; set; } + } + [Fact] public void IgnoreColumns() { var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", ""); diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLUpdateTest.cs index 602195ff..47267c86 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLUpdateTest.cs @@ -63,7 +63,20 @@ namespace FreeSql.Tests.PostgreSQL public int id2 { get; set; } public string xx { get; set; } } - + [Fact] + public void SetSourceIgnore() + { + Assert.Equal("UPDATE \"tssi01\" SET \"tint\" = 10 WHERE (\"id\" = '00000000-0000-0000-0000-000000000000')", + g.pgsql.Update().NoneParameter() + .SetSourceIgnore(new tssi01 { id = Guid.Empty, tint = 10 }, col => col == null).ToSql().Replace("\r\n", "")); + } + public class tssi01 + { + [Column(CanUpdate = false)] + public Guid id { get; set; } + public int tint { get; set; } + public string title { get; set; } + } [Fact] public void IgnoreColumns() { diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerUpdateTest.cs index 0bbb6a58..80474061 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerUpdateTest.cs @@ -74,7 +74,20 @@ namespace FreeSql.Tests.SqlServer public int id2 { get; set; } public string xx { get; set; } } - + [Fact] + public void SetSourceIgnore() + { + Assert.Equal("UPDATE [tssi01] SET [tint] = 10 WHERE ([id] = '00000000-0000-0000-0000-000000000000')", + g.sqlserver.Update().NoneParameter() + .SetSourceIgnore(new tssi01 { id = Guid.Empty, tint = 10 }, col => col == null).ToSql().Replace("\r\n", "")); + } + public class tssi01 + { + [Column(CanUpdate = false)] + public Guid id { get; set; } + public int tint { get; set; } + public string title { get; set; } + } [Fact] public void IgnoreColumns() { diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteUpdateTest.cs index 577637c5..49c868b5 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteUpdateTest.cs @@ -65,6 +65,20 @@ namespace FreeSql.Tests.Sqlite public string xx { get; set; } } [Fact] + public void SetSourceIgnore() + { + Assert.Equal("UPDATE \"tssi01\" SET \"tint\" = 10 WHERE (\"id\" = '00000000-0000-0000-0000-000000000000')", + g.sqlite.Update().NoneParameter() + .SetSourceIgnore(new tssi01 { id = Guid.Empty, tint = 10 }, col => col == null).ToSql().Replace("\r\n", "")); + } + public class tssi01 + { + [Column(CanUpdate = false)] + public Guid id { get; set; } + public int tint { get; set; } + public string title { get; set; } + } + [Fact] public void IgnoreColumns() { var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime, a.TypeGuid }).ToSql().Replace("\r\n", ""); diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 931f82fe..40b864cc 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -2048,30 +2048,44 @@ 实体集合 + + + 更新数据,设置更新的实体,同时设置忽略的列 + 忽略 null 属性:fsql.Update<T>().SetSourceAndIgnore(item, colval => colval == null) + 注意:参数 ignore 与 IUpdate.IgnoreColumns/UpdateColumns 不能同时使用 + + 实体 + 属性值忽略判断, true忽略 + + - 忽略的列,IgnoreColumns(a => a.Name) | IgnoreColumns(a => new{a.Name,a.Time}) | IgnoreColumns(a => new[]{"name","time"}) + 忽略的列,IgnoreColumns(a => a.Name) | IgnoreColumns(a => new{a.Name,a.Time}) | IgnoreColumns(a => new[]{"name","time"}) + 注意:不能与 UpdateColumns 不能同时使用 lambda选择列 - 忽略的列 + 忽略的列 + 注意:不能与 UpdateColumns 不能同时使用 属性名,或者字段名 - 指定的列,UpdateColumns(a => a.Name) | UpdateColumns(a => new{a.Name,a.Time}) | UpdateColumns(a => new[]{"name","time"}) + 指定的列,UpdateColumns(a => a.Name) | UpdateColumns(a => new{a.Name,a.Time}) | UpdateColumns(a => new[]{"name","time"}) + 注意:不能与 IgnoreColumns 不能同时使用 lambda选择列 - 指定的列 + 指定的列 + 注意:不能与 IgnoreColumns 同时使用 属性名,或者字段名 diff --git a/FreeSql/FreeSqlBuilder.cs b/FreeSql/FreeSqlBuilder.cs index 05f3c979..83bb76ff 100644 --- a/FreeSql/FreeSqlBuilder.cs +++ b/FreeSql/FreeSqlBuilder.cs @@ -250,15 +250,9 @@ namespace FreeSql ret.CodeFirst.IsLazyLoading = _isLazyLoading; if (_aopCommandExecuting != null) - ret.Aop.CommandBefore += new EventHandler((s, e) => - { - _aopCommandExecuting?.Invoke(e.Command); - }); + ret.Aop.CommandBefore += new EventHandler((s, e) => _aopCommandExecuting?.Invoke(e.Command)); if (_aopCommandExecuted != null) - ret.Aop.CommandAfter += new EventHandler((s, e) => - { - _aopCommandExecuted?.Invoke(e.Command, e.Log); - }); + ret.Aop.CommandAfter += new EventHandler((s, e) => _aopCommandExecuted?.Invoke(e.Command, e.Log)); this.EntityPropertyNameConvert(ret); //添加实体属性名全局AOP转换处理 diff --git a/FreeSql/Interface/Curd/IUpdate.cs b/FreeSql/Interface/Curd/IUpdate.cs index 4d40419e..cc28b273 100644 --- a/FreeSql/Interface/Curd/IUpdate.cs +++ b/FreeSql/Interface/Curd/IUpdate.cs @@ -57,28 +57,41 @@ namespace FreeSql /// 实体集合 /// IUpdate SetSource(IEnumerable source); - /// - /// 忽略的列,IgnoreColumns(a => a.Name) | IgnoreColumns(a => new{a.Name,a.Time}) | IgnoreColumns(a => new[]{"name","time"}) + /// 更新数据,设置更新的实体,同时设置忽略的列 + /// 忽略 null 属性:fsql.Update<T>().SetSourceAndIgnore(item, colval => colval == null) + /// 注意:参数 ignore 与 IUpdate.IgnoreColumns/UpdateColumns 不能同时使用 + /// + /// 实体 + /// 属性值忽略判断, true忽略 + /// + IUpdate SetSourceIgnore(T1 source, Func ignore); + + /// + /// 忽略的列,IgnoreColumns(a => a.Name) | IgnoreColumns(a => new{a.Name,a.Time}) | IgnoreColumns(a => new[]{"name","time"}) + /// 注意:不能与 UpdateColumns 不能同时使用 /// /// lambda选择列 /// IUpdate IgnoreColumns(Expression> columns); /// - /// 忽略的列 + /// 忽略的列 + /// 注意:不能与 UpdateColumns 不能同时使用 /// /// 属性名,或者字段名 /// IUpdate IgnoreColumns(string[] columns); /// - /// 指定的列,UpdateColumns(a => a.Name) | UpdateColumns(a => new{a.Name,a.Time}) | UpdateColumns(a => new[]{"name","time"}) + /// 指定的列,UpdateColumns(a => a.Name) | UpdateColumns(a => new{a.Name,a.Time}) | UpdateColumns(a => new[]{"name","time"}) + /// 注意:不能与 IgnoreColumns 不能同时使用 /// /// lambda选择列 /// IUpdate UpdateColumns(Expression> columns); /// - /// 指定的列 + /// 指定的列 + /// 注意:不能与 IgnoreColumns 同时使用 /// /// 属性名,或者字段名 /// diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index df335d50..1757826b 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -55,7 +55,7 @@ namespace FreeSql.Internal.CommonProvider { if (_table == null || _table.Type == typeof(object)) return; foreach (var col in _table.Columns.Values) - if (col.Attribute.CanUpdate == false) + if (col.Attribute.CanUpdate == false && _ignore.ContainsKey(col.Attribute.Name) == false) _ignore.Add(col.Attribute.Name, true); } protected void ClearData() @@ -375,6 +375,16 @@ namespace FreeSql.Internal.CommonProvider _source.AddRange(source.Where(a => a != null)); return this; } + public IUpdate SetSourceIgnore(T1 source, Func ignore) + { + if (ignore == null) throw new ArgumentNullException(nameof(ignore)); + var columns = _table.Columns.Values + .Where(col => ignore(_orm.GetEntityValueWithPropertyName(_table.Type, source, col.CsName))) + .Select(col => col.Attribute.Name).ToArray(); + IgnoreColumns(columns); + IgnoreCanUpdate(); + return SetSource(source); + } protected void SetPriv(ColumnInfo col, object value) {