mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 修复 IFreeSql.InsertOrUpdate Merge into 未处理 CanUpdate 的问题;#330
This commit is contained in:
		@@ -125,6 +125,13 @@
 | 
				
			|||||||
            清空状态数据
 | 
					            清空状态数据
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.DbSet`1.RemoveAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            根据 lambda 条件删除数据
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="predicate"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.DbSet`1.Add(`0)">
 | 
					        <member name="M:FreeSql.DbSet`1.Add(`0)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            添加
 | 
					            添加
 | 
				
			||||||
@@ -479,5 +486,14 @@
 | 
				
			|||||||
            <param name="that"></param>
 | 
					            <param name="that"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            批量注入 Repository,可以参考代码自行调整
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="services"></param>
 | 
				
			||||||
 | 
					            <param name="globalDataFilter"></param>
 | 
				
			||||||
 | 
					            <param name="assemblies"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
    </members>
 | 
					    </members>
 | 
				
			||||||
</doc>
 | 
					</doc>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,7 +33,7 @@ namespace FreeSql.Dameng.Curd
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                if (_table.Primarys.Any() == false) throw new Exception($"InsertOrUpdate 功能执行 merge into 要求实体类 {_table.CsName} 必须有主键");
 | 
					                if (_table.Primarys.Any() == false) throw new Exception($"InsertOrUpdate 功能执行 merge into 要求实体类 {_table.CsName} 必须有主键");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var sb = new StringBuilder().Append("MERGE INTO ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" t1 \r\n").Append("USING (");
 | 
					                var sb = new StringBuilder().Append("MERGE INTO ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" t1 \r\nUSING (");
 | 
				
			||||||
                WriteSourceSelectUnionAll(data, sb, dbParams);
 | 
					                WriteSourceSelectUnionAll(data, sb, dbParams);
 | 
				
			||||||
                sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
 | 
					                sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -46,7 +46,8 @@ namespace FreeSql.Dameng.Curd
 | 
				
			|||||||
                            $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"
 | 
					                            $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"
 | 
				
			||||||
                            ))).Append(" \r\n");
 | 
					                            ))).Append(" \r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                cols = _table.Columns.Values;
 | 
					                cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true);
 | 
				
			||||||
 | 
					                if (cols.Any())
 | 
				
			||||||
                    sb.Append("WHEN NOT MATCHED THEN \r\n")
 | 
					                    sb.Append("WHEN NOT MATCHED THEN \r\n")
 | 
				
			||||||
                        .Append("  insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n")
 | 
					                        .Append("  insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n")
 | 
				
			||||||
                        .Append("  values (").Append(string.Join(", ", cols.Select(a => $"t2.{a.Attribute.Name}"))).Append(")");
 | 
					                        .Append("  values (").Append(string.Join(", ", cols.Select(a => $"t2.{a.Attribute.Name}"))).Append(")");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,7 +33,7 @@ namespace FreeSql.Odbc.Dameng
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                if (_table.Primarys.Any() == false) throw new Exception($"InsertOrUpdate 功能执行 merge into 要求实体类 {_table.CsName} 必须有主键");
 | 
					                if (_table.Primarys.Any() == false) throw new Exception($"InsertOrUpdate 功能执行 merge into 要求实体类 {_table.CsName} 必须有主键");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var sb = new StringBuilder().Append("MERGE INTO ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" t1 \r\n").Append("USING (");
 | 
					                var sb = new StringBuilder().Append("MERGE INTO ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" t1 \r\nUSING (");
 | 
				
			||||||
                WriteSourceSelectUnionAll(data, sb, dbParams);
 | 
					                WriteSourceSelectUnionAll(data, sb, dbParams);
 | 
				
			||||||
                sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
 | 
					                sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -46,7 +46,8 @@ namespace FreeSql.Odbc.Dameng
 | 
				
			|||||||
                            $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"
 | 
					                            $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"
 | 
				
			||||||
                            ))).Append(" \r\n");
 | 
					                            ))).Append(" \r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                cols = _table.Columns.Values;
 | 
					                cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true);
 | 
				
			||||||
 | 
					                if (cols.Any())
 | 
				
			||||||
                    sb.Append("WHEN NOT MATCHED THEN \r\n")
 | 
					                    sb.Append("WHEN NOT MATCHED THEN \r\n")
 | 
				
			||||||
                        .Append("  insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n")
 | 
					                        .Append("  insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n")
 | 
				
			||||||
                        .Append("  values (").Append(string.Join(", ", cols.Select(a => $"t2.{a.Attribute.Name}"))).Append(")");
 | 
					                        .Append("  values (").Append(string.Join(", ", cols.Select(a => $"t2.{a.Attribute.Name}"))).Append(")");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,7 +33,7 @@ namespace FreeSql.Odbc.Oracle
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                if (_table.Primarys.Any() == false) throw new Exception($"InsertOrUpdate 功能执行 merge into 要求实体类 {_table.CsName} 必须有主键");
 | 
					                if (_table.Primarys.Any() == false) throw new Exception($"InsertOrUpdate 功能执行 merge into 要求实体类 {_table.CsName} 必须有主键");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var sb = new StringBuilder().Append("MERGE INTO ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" t1 \r\n").Append("USING (");
 | 
					                var sb = new StringBuilder().Append("MERGE INTO ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" t1 \r\nUSING (");
 | 
				
			||||||
                WriteSourceSelectUnionAll(data, sb, dbParams);
 | 
					                WriteSourceSelectUnionAll(data, sb, dbParams);
 | 
				
			||||||
                sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
 | 
					                sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -46,7 +46,8 @@ namespace FreeSql.Odbc.Oracle
 | 
				
			|||||||
                            $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"
 | 
					                            $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"
 | 
				
			||||||
                            ))).Append(" \r\n");
 | 
					                            ))).Append(" \r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                cols = _table.Columns.Values;
 | 
					                cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true);
 | 
				
			||||||
 | 
					                if (cols.Any())
 | 
				
			||||||
                    sb.Append("WHEN NOT MATCHED THEN \r\n")
 | 
					                    sb.Append("WHEN NOT MATCHED THEN \r\n")
 | 
				
			||||||
                        .Append("  insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n")
 | 
					                        .Append("  insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n")
 | 
				
			||||||
                        .Append("  values (").Append(string.Join(", ", cols.Select(a => $"t2.{a.Attribute.Name}"))).Append(")");
 | 
					                        .Append("  values (").Append(string.Join(", ", cols.Select(a => $"t2.{a.Attribute.Name}"))).Append(")");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,8 +35,7 @@ namespace FreeSql.Odbc.SqlServer
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                var sb = new StringBuilder();
 | 
					                var sb = new StringBuilder();
 | 
				
			||||||
                if (IdentityColumn != null) sb.Append("SET IDENTITY_INSERT ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" ON;\r\n");
 | 
					                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\n")
 | 
					                sb.Append("MERGE INTO ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" t1 \r\nUSING (");
 | 
				
			||||||
                .Append("USING (");
 | 
					 | 
				
			||||||
                WriteSourceSelectUnionAll(data, sb, dbParams);
 | 
					                WriteSourceSelectUnionAll(data, sb, dbParams);
 | 
				
			||||||
                sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
 | 
					                sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -49,7 +48,8 @@ namespace FreeSql.Odbc.SqlServer
 | 
				
			|||||||
                            $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"
 | 
					                            $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"
 | 
				
			||||||
                            ))).Append(" \r\n");
 | 
					                            ))).Append(" \r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                cols = _table.Columns.Values;
 | 
					                cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true);
 | 
				
			||||||
 | 
					                if (cols.Any())
 | 
				
			||||||
                    sb.Append("WHEN NOT MATCHED THEN \r\n")
 | 
					                    sb.Append("WHEN NOT MATCHED THEN \r\n")
 | 
				
			||||||
                        .Append("  insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n")
 | 
					                        .Append("  insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n")
 | 
				
			||||||
                        .Append("  values (").Append(string.Join(", ", cols.Select(a => $"t2.{a.Attribute.Name}"))).Append(");");
 | 
					                        .Append("  values (").Append(string.Join(", ", cols.Select(a => $"t2.{a.Attribute.Name}"))).Append(");");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,7 +33,7 @@ namespace FreeSql.Oracle.Curd
 | 
				
			|||||||
            {
 | 
					            {
 | 
				
			||||||
                if (_table.Primarys.Any() == false) throw new Exception($"InsertOrUpdate 功能执行 merge into 要求实体类 {_table.CsName} 必须有主键");
 | 
					                if (_table.Primarys.Any() == false) throw new Exception($"InsertOrUpdate 功能执行 merge into 要求实体类 {_table.CsName} 必须有主键");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var sb = new StringBuilder().Append("MERGE INTO ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" t1 \r\n").Append("USING (");
 | 
					                var sb = new StringBuilder().Append("MERGE INTO ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" t1 \r\nUSING (");
 | 
				
			||||||
                WriteSourceSelectUnionAll(data, sb, dbParams);
 | 
					                WriteSourceSelectUnionAll(data, sb, dbParams);
 | 
				
			||||||
                sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
 | 
					                sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -46,7 +46,8 @@ namespace FreeSql.Oracle.Curd
 | 
				
			|||||||
                            $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"
 | 
					                            $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"
 | 
				
			||||||
                            ))).Append(" \r\n");
 | 
					                            ))).Append(" \r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                cols = _table.Columns.Values;
 | 
					                cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true);
 | 
				
			||||||
 | 
					                if (cols.Any())
 | 
				
			||||||
                    sb.Append("WHEN NOT MATCHED THEN \r\n")
 | 
					                    sb.Append("WHEN NOT MATCHED THEN \r\n")
 | 
				
			||||||
                        .Append("  insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n")
 | 
					                        .Append("  insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n")
 | 
				
			||||||
                        .Append("  values (").Append(string.Join(", ", cols.Select(a => $"t2.{a.Attribute.Name}"))).Append(")");
 | 
					                        .Append("  values (").Append(string.Join(", ", cols.Select(a => $"t2.{a.Attribute.Name}"))).Append(")");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,8 +35,7 @@ namespace FreeSql.SqlServer.Curd
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                var sb = new StringBuilder();
 | 
					                var sb = new StringBuilder();
 | 
				
			||||||
                if (IdentityColumn != null) sb.Append("SET IDENTITY_INSERT ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" ON;\r\n");
 | 
					                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\n")
 | 
					                sb.Append("MERGE INTO ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" t1 \r\nUSING (");
 | 
				
			||||||
                .Append("USING (");
 | 
					 | 
				
			||||||
                WriteSourceSelectUnionAll(data, sb, dbParams);
 | 
					                WriteSourceSelectUnionAll(data, sb, dbParams);
 | 
				
			||||||
                sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
 | 
					                sb.Append(" ) t2 ON (").Append(string.Join(" AND ", _table.Primarys.Select(a => $"t1.{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"))).Append(") \r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -49,7 +48,8 @@ namespace FreeSql.SqlServer.Curd
 | 
				
			|||||||
                            $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"
 | 
					                            $"{_commonUtils.QuoteSqlName(a.Attribute.Name)} = t2.{a.Attribute.Name}"
 | 
				
			||||||
                            ))).Append(" \r\n");
 | 
					                            ))).Append(" \r\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                cols = _table.Columns.Values;
 | 
					                cols = _table.Columns.Values.Where(a => a.Attribute.CanInsert == true);
 | 
				
			||||||
 | 
					                if (cols.Any())
 | 
				
			||||||
                    sb.Append("WHEN NOT MATCHED THEN \r\n")
 | 
					                    sb.Append("WHEN NOT MATCHED THEN \r\n")
 | 
				
			||||||
                        .Append("  insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n")
 | 
					                        .Append("  insert (").Append(string.Join(", ", cols.Select(a => _commonUtils.QuoteSqlName(a.Attribute.Name)))).Append(") \r\n")
 | 
				
			||||||
                        .Append("  values (").Append(string.Join(", ", cols.Select(a => $"t2.{a.Attribute.Name}"))).Append(");");
 | 
					                        .Append("  values (").Append(string.Join(", ", cols.Select(a => $"t2.{a.Attribute.Name}"))).Append(");");
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user