From 90438e20d8dc1cadaab6444bf2ebdb41ea4e0a85 Mon Sep 17 00:00:00 2001
From: 2881099 <2881099@qq.com>
Date: Thu, 4 Mar 2021 15:13:39 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20IUpdate.SetSource=20?=
=?UTF-8?q?=E6=89=B9=E9=87=8F=E6=9B=B4=E6=96=B0=E6=97=B6=E6=8C=87=E5=AE=9A?=
=?UTF-8?q?=E4=B8=BB=E9=94=AE=EF=BC=9B#337?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql.DbContext/FreeSql.DbContext.xml | 9 ------
.../MySql/Curd/MySqlUpdateTest.cs | 3 ++
FreeSql/FreeSql.xml | 3 +-
FreeSql/Interface/Curd/IUpdate.cs | 3 +-
.../Internal/CommonProvider/DeleteProvider.cs | 2 +-
.../Internal/CommonProvider/UpdateProvider.cs | 28 +++++++++++++------
FreeSql/Internal/CommonUtils.cs | 10 +++----
.../Curd/CustomUpdate.cs | 12 ++++----
.../Curd/DamengUpdate.cs | 12 ++++----
.../Curd/FirebirdUpdate.cs | 12 ++++----
.../Curd/KingbaseESUpdate.cs | 12 ++++----
.../Curd/MsAccessUpdate.cs | 12 ++++----
.../Curd/MySqlUpdate.cs | 12 ++++----
.../Dameng/Curd/OdbcDamengUpdate.cs | 12 ++++----
.../Default/Curd/OdbcUpdate.cs | 12 ++++----
.../KingbaseES/Curd/OdbcKingbaseESUpdate.cs | 12 ++++----
.../MySql/Curd/OdbcMySqlUpdate.cs | 12 ++++----
.../Oracle/Curd/OdbcOracleUpdate.cs | 14 +++++-----
.../PostgreSQL/Curd/OdbcPostgreSQLUpdate.cs | 12 ++++----
.../SqlServer/Curd/OdbcSqlServerUpdate.cs | 12 ++++----
.../Curd/OracleUpdate.cs | 14 +++++-----
.../Curd/PostgreSQLUpdate.cs | 12 ++++----
.../Curd/ShenTongUpdate.cs | 12 ++++----
.../Curd/SqlServerUpdate.cs | 12 ++++----
.../Curd/SqliteUpdate.cs | 12 ++++----
25 files changed, 142 insertions(+), 136 deletions(-)
diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index 27909b2e..02eb0609 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -512,14 +512,5 @@
-
-
- 批量注入 Repository,可以参考代码自行调整
-
-
-
-
-
-
diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlUpdateTest.cs
index 3294d265..07b116f1 100644
--- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlUpdateTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlUpdateTest.cs
@@ -55,6 +55,9 @@ namespace FreeSql.Tests.MySql
sql = update.SetSource(items).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET `Title` = CASE `Id` WHEN 1 THEN ?p_0 WHEN 2 THEN ?p_1 WHEN 3 THEN ?p_2 WHEN 4 THEN ?p_3 WHEN 5 THEN ?p_4 WHEN 6 THEN ?p_5 WHEN 7 THEN ?p_6 WHEN 8 THEN ?p_7 WHEN 9 THEN ?p_8 WHEN 10 THEN ?p_9 END WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))", sql);
+ sql = update.SetSource(items, a => a.Title).ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE `tb_topic` SET `Clicks` = CASE `Title` WHEN 'newtitle0' THEN ?p_0 WHEN 'newtitle1' THEN ?p_1 WHEN 'newtitle2' THEN ?p_2 WHEN 'newtitle3' THEN ?p_3 WHEN 'newtitle4' THEN ?p_4 WHEN 'newtitle5' THEN ?p_5 WHEN 'newtitle6' THEN ?p_6 WHEN 'newtitle7' THEN ?p_7 WHEN 'newtitle8' THEN ?p_8 WHEN 'newtitle9' THEN ?p_9 END, `CreateTime` = CASE `Title` WHEN 'newtitle0' THEN ?p_10 WHEN 'newtitle1' THEN ?p_11 WHEN 'newtitle2' THEN ?p_12 WHEN 'newtitle3' THEN ?p_13 WHEN 'newtitle4' THEN ?p_14 WHEN 'newtitle5' THEN ?p_15 WHEN 'newtitle6' THEN ?p_16 WHEN 'newtitle7' THEN ?p_17 WHEN 'newtitle8' THEN ?p_18 WHEN 'newtitle9' THEN ?p_19 END WHERE (`Title` IN ('newtitle0','newtitle1','newtitle2','newtitle3','newtitle4','newtitle5','newtitle6','newtitle7','newtitle8','newtitle9'))", sql);
+
sql = update.SetSource(items).Set(a => a.CreateTime, new DateTime(2020, 1, 1)).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE `tb_topic` SET `CreateTime` = ?p_0 WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))", sql);
diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index fd0aedfe..69519dc0 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -2726,12 +2726,13 @@
实体
-
+
更新数据,设置更新的实体集合
注意:实体必须定义主键,并且最终会自动附加条件 where id in (source.Id)
实体集合
+ 根据主键更新,a => a.Name | a => new{a.Name,a.Time} | a => new[]{"name","time"}
diff --git a/FreeSql/Interface/Curd/IUpdate.cs b/FreeSql/Interface/Curd/IUpdate.cs
index f18eeb3b..91bc3eae 100644
--- a/FreeSql/Interface/Curd/IUpdate.cs
+++ b/FreeSql/Interface/Curd/IUpdate.cs
@@ -72,8 +72,9 @@ namespace FreeSql
/// 注意:实体必须定义主键,并且最终会自动附加条件 where id in (source.Id)
///
/// 实体集合
+ /// 根据主键更新,a => a.Name | a => new{a.Name,a.Time} | a => new[]{"name","time"}
///
- IUpdate SetSource(IEnumerable source);
+ IUpdate SetSource(IEnumerable source, Expression> primarys = null);
///
/// 更新数据,设置更新的实体,同时设置忽略的列
/// 忽略 null 属性:fsql.Update<T>().SetSourceAndIgnore(item, colval => colval == null)
diff --git a/FreeSql/Internal/CommonProvider/DeleteProvider.cs b/FreeSql/Internal/CommonProvider/DeleteProvider.cs
index 448ff585..95d92df9 100644
--- a/FreeSql/Internal/CommonProvider/DeleteProvider.cs
+++ b/FreeSql/Internal/CommonProvider/DeleteProvider.cs
@@ -108,7 +108,7 @@ namespace FreeSql.Internal.CommonProvider
return this;
}
public IDelete Where(T1 item) => this.Where(new[] { item });
- public IDelete Where(IEnumerable items) => this.Where(_commonUtils.WhereItems(_table, "", items));
+ public IDelete Where(IEnumerable items) => this.Where(_commonUtils.WhereItems(_table.Primarys, "", items));
public IDelete WhereDynamic(object dywhere, bool not = false) => not == false ?
this.Where(_commonUtils.WhereObject(_table, "", dywhere)) :
this.Where($"not({_commonUtils.WhereObject(_table, "", dywhere)})");
diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs
index 8f5044fd..547e8d17 100644
--- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs
+++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs
@@ -22,6 +22,7 @@ namespace FreeSql.Internal.CommonProvider
public Dictionary _ignore = new Dictionary(StringComparer.CurrentCultureIgnoreCase);
public Dictionary _auditValueChangedDict = new Dictionary(StringComparer.CurrentCultureIgnoreCase);
public TableInfo _table;
+ public ColumnInfo[] _tempPrimarys;
public Func _tableRule;
public StringBuilder _where = new StringBuilder();
public List _whereGlobalFilter;
@@ -45,6 +46,7 @@ namespace FreeSql.Internal.CommonProvider
_commonUtils = commonUtils;
_commonExpression = commonExpression;
_table = _commonUtils.GetTableByEntity(typeof(T1));
+ _tempPrimarys = _table.Primarys;
_noneParameter = _orm.CodeFirst.IsNoneCommandParameter;
this.Where(_commonUtils.WhereObject(_table, "", dywhere));
if (_orm.CodeFirst.IsAutoSyncStructure && typeof(T1) != typeof(object)) _orm.CodeFirst.SyncStructure();
@@ -410,11 +412,17 @@ namespace FreeSql.Internal.CommonProvider
}
public IUpdate SetSource(T1 source) => this.SetSource(new[] { source });
- public IUpdate SetSource(IEnumerable source)
+ public IUpdate SetSource(IEnumerable source, Expression> tempPrimarys = null)
{
if (source == null || source.Any() == false) return this;
AuditDataValue(this, source, _orm, _table, _auditValueChangedDict);
_source.AddRange(source.Where(a => a != null));
+
+ if (tempPrimarys != null)
+ {
+ var cols = _commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, tempPrimarys?.Body, false, null).Distinct().ToDictionary(a => a);
+ _tempPrimarys = cols.Keys.Select(a => _table.ColumnsByCs.TryGetValue(a, out var col) ? col : null).ToArray().Where(a => a != null).ToArray();
+ }
return this;
}
public IUpdate SetSourceIgnore(T1 source, Func