mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 增加 IInsertOrUpdate.SetSource(items, tempPrimarys) 指定临时主键参数;#1160
This commit is contained in:
		@@ -31,13 +31,13 @@ namespace FreeSql.Odbc.Dameng
 | 
			
		||||
 | 
			
		||||
            string getMergeSql(List<T1> data)
 | 
			
		||||
            {
 | 
			
		||||
                if (_table.Primarys.Any() == false) throw new Exception(CoreStrings.InsertOrUpdate_Must_Primary_Key(_table.CsName));
 | 
			
		||||
                if (_tempPrimarys.Any() == false) throw new Exception(CoreStrings.InsertOrUpdate_Must_Primary_Key(_table.CsName));
 | 
			
		||||
 | 
			
		||||
                var sb = new StringBuilder().Append("MERGE INTO ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" t1 \r\nUSING (");
 | 
			
		||||
                WriteSourceSelectUnionAll(data, sb, dbParams);
 | 
			
		||||
                sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(") \r\n");
 | 
			
		||||
                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 => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
 | 
			
		||||
                var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && _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 =>
 | 
			
		||||
 
 | 
			
		||||
@@ -45,7 +45,8 @@ namespace FreeSql.Odbc.KingbaseES
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    var ocdu = new OdbcKingbaseESOnConflictDoUpdate<T1>(insert.InsertIdentity());
 | 
			
		||||
                    var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
 | 
			
		||||
                    ocdu._tempPrimarys = _tempPrimarys;
 | 
			
		||||
                    var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
 | 
			
		||||
                    ocdu.UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray());
 | 
			
		||||
                    if (_doNothing == true || cols.Any() == false)
 | 
			
		||||
                        ocdu.DoNothing();
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ namespace FreeSql.Odbc.KingbaseES
 | 
			
		||||
        internal OdbcKingbaseESUpdate<T1> _pgsqlUpdate => _pgsqlUpdatePriv ?? 
 | 
			
		||||
            (_pgsqlUpdatePriv = new OdbcKingbaseESUpdate<T1>(_pgsqlInsert.InternalOrm, _pgsqlInsert.InternalCommonUtils, _pgsqlInsert.InternalCommonExpression, null) { InternalTableAlias = "EXCLUDED" }
 | 
			
		||||
                .NoneParameter().SetSource(_pgsqlInsert.InternalSource) as OdbcKingbaseESUpdate<T1>);
 | 
			
		||||
        ColumnInfo[] _columns;
 | 
			
		||||
        internal ColumnInfo[] _tempPrimarys;
 | 
			
		||||
        bool _doNothing;
 | 
			
		||||
 | 
			
		||||
        public OdbcKingbaseESOnConflictDoUpdate(IInsert<T1> insert, Expression<Func<T1, object>> columns = null)
 | 
			
		||||
@@ -34,11 +34,11 @@ namespace FreeSql.Odbc.KingbaseES
 | 
			
		||||
                foreach (var col in _pgsqlInsert.InternalTable.Columns.Values)
 | 
			
		||||
                    if (cols.ContainsKey(col.Attribute.Name))
 | 
			
		||||
                        colsList.Add(col);
 | 
			
		||||
                _columns = colsList.ToArray();
 | 
			
		||||
                _tempPrimarys = colsList.ToArray();
 | 
			
		||||
            }
 | 
			
		||||
            if (_columns == null || _columns.Any() == false)
 | 
			
		||||
                _columns = _pgsqlInsert.InternalTable.Primarys;
 | 
			
		||||
            if (_columns.Any() == false) throw new Exception(CoreStrings.S_OnConflictDoUpdate_MustIsPrimary);
 | 
			
		||||
            if (_tempPrimarys == null || _tempPrimarys.Any() == false)
 | 
			
		||||
                _tempPrimarys = _pgsqlInsert.InternalTable.Primarys;
 | 
			
		||||
            if (_tempPrimarys.Any() == false) throw new Exception(CoreStrings.S_OnConflictDoUpdate_MustIsPrimary);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected void ClearData()
 | 
			
		||||
@@ -96,10 +96,10 @@ namespace FreeSql.Odbc.KingbaseES
 | 
			
		||||
        {
 | 
			
		||||
            var sb = new StringBuilder();
 | 
			
		||||
            sb.Append(_pgsqlInsert.ToSql()).Append("\r\nON CONFLICT(");
 | 
			
		||||
            for (var a = 0; a < _columns.Length; a++)
 | 
			
		||||
            for (var a = 0; a < _tempPrimarys.Length; a++)
 | 
			
		||||
            {
 | 
			
		||||
                if (a > 0) sb.Append(", ");
 | 
			
		||||
                sb.Append(_pgsqlInsert.InternalCommonUtils.QuoteSqlName(_columns[a].Attribute.Name));
 | 
			
		||||
                sb.Append(_pgsqlInsert.InternalCommonUtils.QuoteSqlName(_tempPrimarys[a].Attribute.Name));
 | 
			
		||||
            }
 | 
			
		||||
            if (_doNothing)
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
@@ -46,14 +46,14 @@ namespace FreeSql.Odbc.MySql
 | 
			
		||||
                    insert.InsertIdentity();
 | 
			
		||||
                    if (_doNothing == false)
 | 
			
		||||
                    {
 | 
			
		||||
                        var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
 | 
			
		||||
                        var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
 | 
			
		||||
                        sql = new OdbcMySqlOnDuplicateKeyUpdate<T1>(insert)
 | 
			
		||||
                            .UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray())
 | 
			
		||||
                            .ToSql();
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        if (_table.Primarys.Any() == false) throw new Exception(CoreStrings.Entity_Must_Primary_Key("fsql.InsertOrUpdate + IfExistsDoNothing + MySql ", _table.CsName));
 | 
			
		||||
                        if (_tempPrimarys.Any() == false) throw new Exception(CoreStrings.Entity_Must_Primary_Key("fsql.InsertOrUpdate + IfExistsDoNothing + MySql ", _table.CsName));
 | 
			
		||||
                        sql = insert.ToSqlValuesOrSelectUnionAllExtension101(false, (rowd, idx, sb) =>
 | 
			
		||||
                            sb.Append(" \r\n FROM dual WHERE NOT EXISTS(").Append(
 | 
			
		||||
                                _orm.Select<T1>()
 | 
			
		||||
 
 | 
			
		||||
@@ -31,13 +31,13 @@ namespace FreeSql.Odbc.Oracle
 | 
			
		||||
 | 
			
		||||
            string getMergeSql(List<T1> data)
 | 
			
		||||
            {
 | 
			
		||||
                if (_table.Primarys.Any() == false) throw new Exception(CoreStrings.InsertOrUpdate_Must_Primary_Key(_table.CsName));
 | 
			
		||||
                if (_tempPrimarys.Any() == false) throw new Exception(CoreStrings.InsertOrUpdate_Must_Primary_Key(_table.CsName));
 | 
			
		||||
 | 
			
		||||
                var sb = new StringBuilder().Append("MERGE INTO ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" t1 \r\nUSING (");
 | 
			
		||||
                WriteSourceSelectUnionAll(data, sb, dbParams);
 | 
			
		||||
                sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(") \r\n");
 | 
			
		||||
                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 => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
 | 
			
		||||
                var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && _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 =>
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,8 @@ namespace FreeSql.Odbc.PostgreSQL
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    var ocdu = new OdbcPostgreSQLOnConflictDoUpdate<T1>(insert.InsertIdentity());
 | 
			
		||||
                    var cols = _table.Columns.Values.Where(a => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
 | 
			
		||||
                    ocdu._tempPrimarys = _tempPrimarys;
 | 
			
		||||
                    var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
 | 
			
		||||
                    ocdu.UpdateColumns(cols.Select(a => a.Attribute.Name).ToArray());
 | 
			
		||||
                    if (_doNothing == true || cols.Any() == false)
 | 
			
		||||
                        ocdu.DoNothing();
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ namespace FreeSql.Odbc.PostgreSQL
 | 
			
		||||
        internal OdbcPostgreSQLUpdate<T1> _pgsqlUpdate => _pgsqlUpdatePriv ?? 
 | 
			
		||||
            (_pgsqlUpdatePriv = new OdbcPostgreSQLUpdate<T1>(_pgsqlInsert.InternalOrm, _pgsqlInsert.InternalCommonUtils, _pgsqlInsert.InternalCommonExpression, null) { InternalTableAlias = "EXCLUDED" }
 | 
			
		||||
                .NoneParameter().SetSource(_pgsqlInsert.InternalSource) as OdbcPostgreSQLUpdate<T1>);
 | 
			
		||||
        ColumnInfo[] _columns;
 | 
			
		||||
        internal ColumnInfo[] _tempPrimarys;
 | 
			
		||||
        bool _doNothing;
 | 
			
		||||
 | 
			
		||||
        public OdbcPostgreSQLOnConflictDoUpdate(IInsert<T1> insert, Expression<Func<T1, object>> columns = null)
 | 
			
		||||
@@ -34,11 +34,11 @@ namespace FreeSql.Odbc.PostgreSQL
 | 
			
		||||
                foreach (var col in _pgsqlInsert.InternalTable.Columns.Values)
 | 
			
		||||
                    if (cols.ContainsKey(col.Attribute.Name))
 | 
			
		||||
                        colsList.Add(col);
 | 
			
		||||
                _columns = colsList.ToArray();
 | 
			
		||||
                _tempPrimarys = colsList.ToArray();
 | 
			
		||||
            }
 | 
			
		||||
            if (_columns == null || _columns.Any() == false)
 | 
			
		||||
                _columns = _pgsqlInsert.InternalTable.Primarys;
 | 
			
		||||
            if (_columns.Any() == false) throw new Exception(CoreStrings.S_OnConflictDoUpdate_MustIsPrimary);
 | 
			
		||||
            if (_tempPrimarys == null || _tempPrimarys.Any() == false)
 | 
			
		||||
                _tempPrimarys = _pgsqlInsert.InternalTable.Primarys;
 | 
			
		||||
            if (_tempPrimarys.Any() == false) throw new Exception(CoreStrings.S_OnConflictDoUpdate_MustIsPrimary);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected void ClearData()
 | 
			
		||||
@@ -96,10 +96,10 @@ namespace FreeSql.Odbc.PostgreSQL
 | 
			
		||||
        {
 | 
			
		||||
            var sb = new StringBuilder();
 | 
			
		||||
            sb.Append(_pgsqlInsert.ToSql()).Append("\r\nON CONFLICT(");
 | 
			
		||||
            for (var a = 0; a < _columns.Length; a++)
 | 
			
		||||
            for (var a = 0; a < _tempPrimarys.Length; a++)
 | 
			
		||||
            {
 | 
			
		||||
                if (a > 0) sb.Append(", ");
 | 
			
		||||
                sb.Append(_pgsqlInsert.InternalCommonUtils.QuoteSqlName(_columns[a].Attribute.Name));
 | 
			
		||||
                sb.Append(_pgsqlInsert.InternalCommonUtils.QuoteSqlName(_tempPrimarys[a].Attribute.Name));
 | 
			
		||||
            }
 | 
			
		||||
            if (_doNothing)
 | 
			
		||||
            {
 | 
			
		||||
 
 | 
			
		||||
@@ -31,15 +31,15 @@ namespace FreeSql.Odbc.SqlServer
 | 
			
		||||
 | 
			
		||||
            string getMergeSql(List<T1> data)
 | 
			
		||||
            {
 | 
			
		||||
                if (_table.Primarys.Any() == false) throw new Exception(CoreStrings.InsertOrUpdate_Must_Primary_Key(_table.CsName));
 | 
			
		||||
                if (_tempPrimarys.Any() == false) throw new Exception(CoreStrings.InsertOrUpdate_Must_Primary_Key(_table.CsName));
 | 
			
		||||
 | 
			
		||||
                var sb = new StringBuilder();
 | 
			
		||||
                if (IdentityColumn != null) sb.Append("SET IDENTITY_INSERT ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" ON;\r\n");
 | 
			
		||||
                sb.Append("MERGE INTO ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" t1 \r\nUSING (");
 | 
			
		||||
                WriteSourceSelectUnionAll(data, sb, dbParams);
 | 
			
		||||
                sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{_commonUtils.QuoteSqlName(a.Attribute.Name)}"))).Append(") \r\n");
 | 
			
		||||
                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 => a.Attribute.IsPrimary == false && a.Attribute.CanUpdate == true && _updateIgnore.ContainsKey(a.Attribute.Name) == false);
 | 
			
		||||
                var cols = _table.Columns.Values.Where(a => _tempPrimarys.Contains(a) == false && a.Attribute.CanUpdate == true && _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 =>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user