diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 537315e2..26522f10 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -800,5 +800,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests/Internal/CommonExpressionTest.cs b/FreeSql.Tests/FreeSql.Tests/Internal/CommonExpressionTest.cs index c4194767..ed5e360f 100644 --- a/FreeSql.Tests/FreeSql.Tests/Internal/CommonExpressionTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Internal/CommonExpressionTest.cs @@ -152,99 +152,99 @@ WHERE (a.""BoolNullable"" = 1 AND a.""Id"" > 0 AND a.""BoolNullable"" = 1)", sql // IIF sql = fsql.Select().ToSql(a => a.Bool == true ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""Bool"" = 1 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""Bool"" = 1 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.Bool != true ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""Bool"" <> 1 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""Bool"" <> 1 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.Bool == false ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""Bool"" = 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""Bool"" = 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => !a.Bool ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""Bool"" = 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""Bool"" = 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.Bool ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""Bool"" = 1 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""Bool"" = 1 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.BoolNullable == true ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""BoolNullable"" = 1 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.BoolNullable != true ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""BoolNullable"" <> 1 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""BoolNullable"" <> 1 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.BoolNullable == false ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""BoolNullable"" = 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => !a.BoolNullable.Value ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""BoolNullable"" = 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.BoolNullable.Value ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""BoolNullable"" = 1 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.Bool == true && a.Id > 0 ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""Bool"" = 1 AND a.""Id"" > 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""Bool"" = 1 AND a.""Id"" > 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.Bool != true && a.Id > 0 ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""Bool"" <> 1 AND a.""Id"" > 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""Bool"" <> 1 AND a.""Id"" > 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.Bool == false && a.Id > 0 ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""Bool"" = 0 AND a.""Id"" > 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""Bool"" = 0 AND a.""Id"" > 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => !a.Bool && a.Id > 0 ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""Bool"" = 0 AND a.""Id"" > 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""Bool"" = 0 AND a.""Id"" > 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.Bool && a.Id > 0 ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""Bool"" = 1 AND a.""Id"" > 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""Bool"" = 1 AND a.""Id"" > 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.BoolNullable == true && a.Id > 0 ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 AND a.""Id"" > 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""BoolNullable"" = 1 AND a.""Id"" > 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.BoolNullable != true && a.Id > 0 ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""BoolNullable"" <> 1 AND a.""Id"" > 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""BoolNullable"" <> 1 AND a.""Id"" > 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.BoolNullable == false && a.Id > 0 ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 AND a.""Id"" > 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""BoolNullable"" = 0 AND a.""Id"" > 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => !a.BoolNullable.Value && a.Id > 0 ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 AND a.""Id"" > 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""BoolNullable"" = 0 AND a.""Id"" > 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.BoolNullable.Value && a.Id > 0 ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 AND a.""Id"" > 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""BoolNullable"" = 1 AND a.""Id"" > 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.Bool == true && a.Id > 0 && a.Bool == true ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""Bool"" = 1 AND a.""Id"" > 0 AND a.""Bool"" = 1 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""Bool"" = 1 AND a.""Id"" > 0 AND a.""Bool"" = 1 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.Bool != true && a.Id > 0 && a.Bool != true ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""Bool"" <> 1 AND a.""Id"" > 0 AND a.""Bool"" <> 1 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""Bool"" <> 1 AND a.""Id"" > 0 AND a.""Bool"" <> 1 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.Bool == false && a.Id > 0 && a.Bool == false ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""Bool"" = 0 AND a.""Id"" > 0 AND a.""Bool"" = 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""Bool"" = 0 AND a.""Id"" > 0 AND a.""Bool"" = 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => !a.Bool && a.Id > 0 && !a.Bool ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""Bool"" = 0 AND a.""Id"" > 0 AND a.""Bool"" = 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""Bool"" = 0 AND a.""Id"" > 0 AND a.""Bool"" = 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.Bool && a.Id > 0 && a.Bool ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""Bool"" = 1 AND a.""Id"" > 0 AND a.""Bool"" = 1 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""Bool"" = 1 AND a.""Id"" > 0 AND a.""Bool"" = 1 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.BoolNullable == true && a.Id > 0 && a.BoolNullable == true ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 AND a.""Id"" > 0 AND a.""BoolNullable"" = 1 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""BoolNullable"" = 1 AND a.""Id"" > 0 AND a.""BoolNullable"" = 1 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.BoolNullable != true && a.Id > 0 && a.BoolNullable != true ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""BoolNullable"" <> 1 AND a.""Id"" > 0 AND a.""BoolNullable"" <> 1 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""BoolNullable"" <> 1 AND a.""Id"" > 0 AND a.""BoolNullable"" <> 1 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.BoolNullable == false && a.Id > 0 && a.BoolNullable == false ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 AND a.""Id"" > 0 AND a.""BoolNullable"" = 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""BoolNullable"" = 0 AND a.""Id"" > 0 AND a.""BoolNullable"" = 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => !a.BoolNullable.Value && a.Id > 0 && !a.BoolNullable.Value ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 0 AND a.""Id"" > 0 AND a.""BoolNullable"" = 0 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""BoolNullable"" = 0 AND a.""Id"" > 0 AND a.""BoolNullable"" = 0 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); sql = fsql.Select().ToSql(a => a.BoolNullable.Value && a.Id > 0 && a.BoolNullable.Value ? 10 : 11); - Assert.Equal(@"SELECT (case when a.""BoolNullable"" = 1 AND a.""Id"" > 0 AND a.""BoolNullable"" = 1 then 10 else 11 end) as1 + Assert.Equal(@"SELECT case when a.""BoolNullable"" = 1 AND a.""Id"" > 0 AND a.""BoolNullable"" = 1 then 10 else 11 end as1 FROM ""IIFTest01Model"" a", sql); } diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/494.cs b/FreeSql.Tests/FreeSql.Tests/Issues/494.cs index a32f7b5e..c2d24f23 100644 --- a/FreeSql.Tests/FreeSql.Tests/Issues/494.cs +++ b/FreeSql.Tests/FreeSql.Tests/Issues/494.cs @@ -22,7 +22,7 @@ namespace FreeSql.Tests.Issues Name = w.Address, No = w.Number.ToString() }, FieldAliasOptions.AsProperty); - Assert.Equal(@"SELECT cast(a.""Number"" as character) ""CardNumber"", ((a.""CommType"" + 1)) ""CardType"", a.""Address"" ""Name"", cast(a.""Number"" as character) ""No"" + Assert.Equal(@"SELECT cast(a.""Number"" as character) ""CardNumber"", (a.""CommType"" + 1) ""CardType"", a.""Address"" ""Name"", cast(a.""Number"" as character) ""No"" FROM ""WorkSite"" a", sql); } diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertOrUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertOrUpdateTest.cs index 471920c9..7299ceec 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertOrUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertOrUpdateTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -15,8 +15,17 @@ namespace FreeSql.Tests.MySql public void InsertOrUpdate_OnePrimary() { fsql.Delete().Where("1=1").ExecuteAffrows(); - var iou = fsql.InsertOrUpdate().SetSource(new tbiou02 { id = 1, name = "01" }); + var iou = fsql.InsertOrUpdate().SetSource(fsql.Select().ToSql(a => new { id = a.id + 1, name = "xxx" }, FieldAliasOptions.AsProperty)); var sql = iou.ToSql(); + Assert.Equal(@"INSERT INTO `tbiou02`(`id`, `name`) +SELECT (a.`id` + 1) `id`, xxx `name` +FROM `tbiou022` a +ON DUPLICATE KEY UPDATE +`name` = VALUES(`name`)", sql); + Assert.Equal(0, iou.ExecuteAffrows()); + + iou = fsql.InsertOrUpdate().SetSource(new tbiou02 { id = 1, name = "01" }); + sql = iou.ToSql(); Assert.Equal(@"INSERT INTO `tbiou02`(`id`, `name`) VALUES(1, '01') ON DUPLICATE KEY UPDATE `name` = VALUES(`name`)", sql); diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLInsertOrUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLInsertOrUpdateTest.cs index 0cd580cc..fb0b8be9 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLInsertOrUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLInsertOrUpdateTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -14,8 +14,16 @@ namespace FreeSql.Tests.PostgreSQL public void InsertOrUpdate_OnlyPrimary() { fsql.Delete().Where("1=1").ExecuteAffrows(); - var iou = fsql.InsertOrUpdate().SetSource(new tbiou01 { id = 1 }); + + var iou = fsql.InsertOrUpdate().SetSource(fsql.Select().ToSql(a => new { id = a.id + 1 }, FieldAliasOptions.AsProperty)); var sql = iou.ToSql(); + Assert.Equal(@"INSERT INTO ""tbiou01""(""id"") +SELECT (a.""id"" + 1) ""id"" +FROM ""tbiou022"" a +ON CONFLICT(""id"") DO NOTHING", sql); + + iou = fsql.InsertOrUpdate().SetSource(new tbiou01 { id = 1 }); + sql = iou.ToSql(); Assert.Equal(@"INSERT INTO ""tbiou01""(""id"") VALUES(1) ON CONFLICT(""id"") DO NOTHING", sql); Assert.Equal(1, iou.ExecuteAffrows()); diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerInsertOrUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerInsertOrUpdateTest.cs index 083c3805..0a2f5440 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerInsertOrUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerInsertOrUpdateTest.cs @@ -16,9 +16,20 @@ namespace FreeSql.Tests.SqlServer public void InsertOrUpdate_OnlyPrimary() { fsql.Delete().Where("1=1").ExecuteAffrows(); - var iou = fsql.InsertOrUpdate().SetSource(new tbiou01 { id = 1 }); + + var iou = fsql.InsertOrUpdate().SetSource(fsql.Select().ToSql(a => new { id = a.id + 1 }, FieldAliasOptions.AsProperty)); var sql = iou.ToSql(); Assert.Equal(@"MERGE INTO [tbiou01] t1 +USING (SELECT (a.[id] + 1) [id] +FROM [tbiou022] a + ) t2 ON (t1.[id] = t2.[id]) +WHEN NOT MATCHED THEN + insert ([id]) + values (t2.[id]);", sql); + + iou = fsql.InsertOrUpdate().SetSource(new tbiou01 { id = 1 }); + sql = iou.ToSql(); + Assert.Equal(@"MERGE INTO [tbiou01] t1 USING (SELECT 1 as [id] ) t2 ON (t1.[id] = t2.[id]) WHEN NOT MATCHED THEN insert ([id]) diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index ddb75687..fd52bcf5 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -3727,6 +3727,13 @@ 实体对象 + + + 中断实体对象审计 + false: 每个实体对象的属性都会审计(默认) + true: 每个实体对象只审计一次 + + ADO.NET 数据流读取对象 diff --git a/FreeSql/Interface/Curd/IInsertOrUpdate.cs b/FreeSql/Interface/Curd/IInsertOrUpdate.cs index 28d9c59d..3b06f6c2 100644 --- a/FreeSql/Interface/Curd/IInsertOrUpdate.cs +++ b/FreeSql/Interface/Curd/IInsertOrUpdate.cs @@ -46,6 +46,8 @@ namespace FreeSql /// IInsertOrUpdate SetSource(IEnumerable source, Expression> tempPrimarys = null); + IInsertOrUpdate SetSource(string sql, Expression> tempPrimarys = null); + /// /// 当记录存在时,什么都不做 /// 换句话:只有记录不存在时才插入 diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 5747daa3..e6bd5c7b 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -494,7 +494,7 @@ namespace FreeSql.Internal if (parent.Childs.Any() == false) throw new Exception(CoreStrings.Mapping_Exception_HasNo_SamePropertyName(newExp.Type.Name)); return true; } - parent.DbField = $"({ExpressionLambdaToSql(exp, getTSC())})"; + parent.DbField = ExpressionLambdaToSql(exp, getTSC()); //解决 new { a = id + 1 } 翻译后 ((id+1)) 问题 field.Append(", ").Append(parent.DbField); LocalSetFieldAlias(ref index, false); if (parent.CsType == null && exp.Type.IsValueType) parent.CsType = exp.Type; diff --git a/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs b/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs index 1f612f98..082358d4 100644 --- a/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs @@ -36,6 +36,7 @@ namespace FreeSql.Internal.CommonProvider public abstract partial class InsertOrUpdateProvider : InsertOrUpdateProvider, IInsertOrUpdate where T1 : class { public List _source = new List(); + public string _sourceSql = null; public InsertOrUpdateProvider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression) { @@ -53,6 +54,7 @@ namespace FreeSql.Internal.CommonProvider protected void ClearData() { _source.Clear(); + _sourceSql = null; _auditValueChangedDict.Clear(); } @@ -119,6 +121,7 @@ namespace FreeSql.Internal.CommonProvider public IInsertOrUpdate SetSource(IEnumerable source, Expression> tempPrimarys = null) { if (source == null || source.Any() == false) return this; + _sourceSql = null; UpdateProvider.GetDictionaryTableInfo(source, _orm, ref _table); AuditDataValue(this, source, _orm, _table, _auditValueChangedDict); _source.AddRange(source.Where(a => a != null)); @@ -130,6 +133,19 @@ namespace FreeSql.Internal.CommonProvider } return this; } + public virtual IInsertOrUpdate SetSource(string sql, Expression> tempPrimarys = null) + { + if (string.IsNullOrWhiteSpace(sql)) return this; + _source.Clear(); + _sourceSql = sql; + + if (tempPrimarys != null) + { + var cols = _commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, null, tempPrimarys?.Body, false, null).Distinct().ToDictionary(a => a); + _tempPrimarys = cols.Keys.Select(a => _table.Columns.TryGetValue(a, out var col) ? col : null).ToArray().Where(a => a != null).ToArray(); + } + return this; + } public IInsertOrUpdate IfExistsDoNothing() { @@ -184,6 +200,12 @@ namespace FreeSql.Internal.CommonProvider public void WriteSourceSelectUnionAll(List source, StringBuilder sb, List dbParams) { + if (_sourceSql != null) + { + sb.Append(_sourceSql).Append("\r\n"); + return; + } + var didx = 0; foreach (var d in source) { diff --git a/Providers/FreeSql.Provider.Dameng/Curd/DamengInsertOrUpdate.cs b/Providers/FreeSql.Provider.Dameng/Curd/DamengInsertOrUpdate.cs index 18770e11..cda02841 100644 --- a/Providers/FreeSql.Provider.Dameng/Curd/DamengInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Dameng/Curd/DamengInsertOrUpdate.cs @@ -17,10 +17,11 @@ namespace FreeSql.Dameng.Curd public override string ToSql() { + var dbParams = new List(); + if (_sourceSql != null) return getMergeSql(null); if (_source?.Any() != true) return null; var sqls = new string[2]; - var dbParams = new List(); var ds = SplitSourceByIdentityValueIsNull(_source); if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getMergeSql(a))); if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a))); diff --git a/Providers/FreeSql.Provider.Firebird/Curd/FirebirdInsertOrUpdate.cs b/Providers/FreeSql.Provider.Firebird/Curd/FirebirdInsertOrUpdate.cs index abc2fe27..e1d80816 100644 --- a/Providers/FreeSql.Provider.Firebird/Curd/FirebirdInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Firebird/Curd/FirebirdInsertOrUpdate.cs @@ -17,10 +17,11 @@ namespace FreeSql.Firebird.Curd public override string ToSql() { + var dbParams = new List(); + if (_sourceSql != null) return getMergeSql(null); if (_source?.Any() != true) return null; var sqls = new string[2]; - var dbParams = new List(); var ds = SplitSourceByIdentityValueIsNull(_source); if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getMergeSql(a))); if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a))); diff --git a/Providers/FreeSql.Provider.GBase/Curd/GBaseInsertOrUpdate.cs b/Providers/FreeSql.Provider.GBase/Curd/GBaseInsertOrUpdate.cs index e2a5f8aa..17d48e6b 100644 --- a/Providers/FreeSql.Provider.GBase/Curd/GBaseInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.GBase/Curd/GBaseInsertOrUpdate.cs @@ -17,10 +17,11 @@ namespace FreeSql.GBase.Curd public override string ToSql() { + var dbParams = new List(); + if (_sourceSql != null) return getMergeSql(null); if (_source?.Any() != true) return null; var sqls = new string[2]; - var dbParams = new List(); var ds = SplitSourceByIdentityValueIsNull(_source); if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getMergeSql(a))); if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a))); diff --git a/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESInsertOrUpdate.cs b/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESInsertOrUpdate.cs index 57c25913..9f08cfa7 100644 --- a/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.KingbaseES/Curd/KingbaseESInsertOrUpdate.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data.Common; using System.Linq; +using System.Text; namespace FreeSql.KingbaseES { @@ -15,25 +16,37 @@ namespace FreeSql.KingbaseES public override string ToSql() { + var dbParams = new List(); + if (_sourceSql != null) + { + var data = new List(); + data.Add((T1)_table.Type.CreateInstanceGetDefaultValue()); + var sql = getInsertSql(data, false, false); + var sb = new StringBuilder(); + sb.Append(sql.Substring(0, sql.IndexOf(") VALUES"))); + sb.Append(") \r\n"); + WriteSourceSelectUnionAll(null, sb, null); + sb.Append(sql.Substring(sql.IndexOf("\r\nON CONFLICT(") + 2)); + return sb.ToString(); + } if (_source?.Any() != true) return null; var sqls = new string[2]; - var dbParams = new List(); var ds = SplitSourceByIdentityValueIsNull(_source); - if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getInsertSql(a, false))); - if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a, true))); + if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getInsertSql(a, false, true))); + if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a, true, true))); _params = dbParams.ToArray(); if (ds.Item2.Any() == false) return sqls[0]; if (ds.Item1.Any() == false) return sqls[1]; return string.Join("\r\n\r\n;\r\n\r\n", sqls); - string getInsertSql(List data, bool flagInsert) + string getInsertSql(List data, bool flagInsert, bool noneParameter) { var insert = _orm.Insert() .AsTable(_tableRule).AsType(_table.Type) .WithConnection(_connection) .WithTransaction(_transaction) - .NoneParameter(true) as Internal.CommonProvider.InsertProvider; + .NoneParameter(noneParameter) as Internal.CommonProvider.InsertProvider; insert._source = data; insert._table = _table; insert._noneParameterFlag = flagInsert ? "cuc" : "cu"; diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs index f241c994..e0fca0fd 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsertOrUpdate.cs @@ -17,25 +17,40 @@ namespace FreeSql.MySql.Curd public override string ToSql() { + var dbParams = new List(); + if (_sourceSql != null) + { + var data = new List(); + data.Add((T1)_table.Type.CreateInstanceGetDefaultValue()); + var sql = getInsertSql(data, false, false); + var sb = new StringBuilder(); + sb.Append(sql.Substring(0, sql.IndexOf(") VALUES"))); + sb.Append(") \r\n"); + WriteSourceSelectUnionAll(null, sb, null); + if (_doNothing == false) + sb.Append(sql.Substring(sql.IndexOf("\r\nON DUPLICATE KEY UPDATE\r\n") + 2)); + else + throw new Exception("Not implemented! fsql.InsertOrUpdate + SetSource(sql) + IfExistsDoNothing + MySql"); + return sb.ToString(); + } if (_source?.Any() != true) return null; var sqls = new string[2]; - var dbParams = new List(); var ds = SplitSourceByIdentityValueIsNull(_source); - if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getInsertSql(a, false))); - if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a, true))); + if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getInsertSql(a, false, true))); + if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a, true, true))); _params = dbParams.ToArray(); if (ds.Item2.Any() == false) return sqls[0]; if (ds.Item1.Any() == false) return sqls[1]; return string.Join("\r\n\r\n;\r\n\r\n", sqls); - string getInsertSql(List data, bool flagInsert) + string getInsertSql(List data, bool flagInsert, bool noneParameter) { var insert = _orm.Insert() .AsTable(_tableRule).AsType(_table.Type) .WithConnection(_connection) .WithTransaction(_transaction) - .NoneParameter(true) as Internal.CommonProvider.InsertProvider; + .NoneParameter(noneParameter) as Internal.CommonProvider.InsertProvider; insert._source = data; insert._table = _table; insert._noneParameterFlag = flagInsert ? "cuc" : "cu"; diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsertOrUpdate.cs index 4f74b771..d5c7b4ce 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/Curd/OdbcDamengInsertOrUpdate.cs @@ -17,10 +17,11 @@ namespace FreeSql.Odbc.Dameng public override string ToSql() { + var dbParams = new List(); + if (_sourceSql != null) return getMergeSql(null); if (_source?.Any() != true) return null; var sqls = new string[2]; - var dbParams = new List(); var ds = SplitSourceByIdentityValueIsNull(_source); if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getMergeSql(a))); if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a))); diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESInsertOrUpdate.cs index 142e8a40..739fb06b 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/Curd/OdbcKingbaseESInsertOrUpdate.cs @@ -17,25 +17,37 @@ namespace FreeSql.Odbc.KingbaseES public override string ToSql() { + var dbParams = new List(); + if (_sourceSql != null) + { + var data = new List(); + data.Add((T1)_table.Type.CreateInstanceGetDefaultValue()); + var sql = getInsertSql(data, false, false); + var sb = new StringBuilder(); + sb.Append(sql.Substring(0, sql.IndexOf(") VALUES"))); + sb.Append(") \r\n"); + WriteSourceSelectUnionAll(null, sb, null); + sb.Append(sql.Substring(sql.IndexOf("\r\nON CONFLICT(") + 2)); + return sb.ToString(); + } if (_source?.Any() != true) return null; var sqls = new string[2]; - var dbParams = new List(); var ds = SplitSourceByIdentityValueIsNull(_source); - if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getInsertSql(a, false))); - if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a, true))); + if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getInsertSql(a, false, true))); + if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a, true, true))); _params = dbParams.ToArray(); if (ds.Item2.Any() == false) return sqls[0]; if (ds.Item1.Any() == false) return sqls[1]; return string.Join("\r\n\r\n;\r\n\r\n", sqls); - string getInsertSql(List data, bool flagInsert) + string getInsertSql(List data, bool flagInsert, bool noneParameter) { var insert = _orm.Insert() .AsTable(_tableRule).AsType(_table.Type) .WithConnection(_connection) .WithTransaction(_transaction) - .NoneParameter(true) as Internal.CommonProvider.InsertProvider; + .NoneParameter(noneParameter) as Internal.CommonProvider.InsertProvider; insert._source = data; insert._table = _table; insert._noneParameterFlag = flagInsert ? "cuc" : "cu"; diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs index 0a36859f..c5bac486 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsertOrUpdate.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; +using System.Text; namespace FreeSql.Odbc.MySql { @@ -16,25 +17,40 @@ namespace FreeSql.Odbc.MySql public override string ToSql() { + var dbParams = new List(); + if (_sourceSql != null) + { + var data = new List(); + data.Add((T1)_table.Type.CreateInstanceGetDefaultValue()); + var sql = getInsertSql(data, false, false); + var sb = new StringBuilder(); + sb.Append(sql.Substring(0, sql.IndexOf(") VALUES"))); + sb.Append(") \r\n"); + WriteSourceSelectUnionAll(null, sb, null); + if (_doNothing == false) + sb.Append(sql.Substring(sql.IndexOf("\r\nON DUPLICATE KEY UPDATE\r\n") + 2)); + else + throw new Exception("Not implemented! fsql.InsertOrUpdate + SetSource(sql) + IfExistsDoNothing + MySql"); + return sb.ToString(); + } if (_source?.Any() != true) return null; var sqls = new string[2]; - var dbParams = new List(); var ds = SplitSourceByIdentityValueIsNull(_source); - if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getInsertSql(a, false))); - if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a, true))); + if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getInsertSql(a, false, true))); + if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a, true, true))); _params = dbParams.ToArray(); if (ds.Item2.Any() == false) return sqls[0]; if (ds.Item1.Any() == false) return sqls[1]; return string.Join("\r\n\r\n;\r\n\r\n", sqls); - string getInsertSql(List data, bool flagInsert) + string getInsertSql(List data, bool flagInsert, bool noneParameter) { var insert = _orm.Insert() .AsTable(_tableRule).AsType(_table.Type) .WithConnection(_connection) .WithTransaction(_transaction) - .NoneParameter(true) as Internal.CommonProvider.InsertProvider; + .NoneParameter(noneParameter) as Internal.CommonProvider.InsertProvider; insert._source = data; insert._table = _table; insert._noneParameterFlag = flagInsert ? "cuc" : "cu"; diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsertOrUpdate.cs index e339a5b5..ce772001 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/Curd/OdbcOracleInsertOrUpdate.cs @@ -17,10 +17,11 @@ namespace FreeSql.Odbc.Oracle public override string ToSql() { + var dbParams = new List(); + if (_sourceSql != null) return getMergeSql(null); if (_source?.Any() != true) return null; var sqls = new string[2]; - var dbParams = new List(); var ds = SplitSourceByIdentityValueIsNull(_source); if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getMergeSql(a))); if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a))); diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs index ca4fe050..0c442abd 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/Curd/OdbcPostgreSQLInsertOrUpdate.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data.Common; using System.Linq; +using System.Text; namespace FreeSql.Odbc.PostgreSQL { @@ -15,25 +16,37 @@ namespace FreeSql.Odbc.PostgreSQL public override string ToSql() { + var dbParams = new List(); + if (_sourceSql != null) + { + var data = new List(); + data.Add((T1)_table.Type.CreateInstanceGetDefaultValue()); + var sql = getInsertSql(data, false, false); + var sb = new StringBuilder(); + sb.Append(sql.Substring(0, sql.IndexOf(") VALUES"))); + sb.Append(") \r\n"); + WriteSourceSelectUnionAll(null, sb, null); + sb.Append(sql.Substring(sql.IndexOf("\r\nON CONFLICT(") + 2)); + return sb.ToString(); + } if (_source?.Any() != true) return null; var sqls = new string[2]; - var dbParams = new List(); var ds = SplitSourceByIdentityValueIsNull(_source); - if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getInsertSql(a, false))); - if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a, true))); + if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getInsertSql(a, false, true))); + if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a, true, true))); _params = dbParams.ToArray(); if (ds.Item2.Any() == false) return sqls[0]; if (ds.Item1.Any() == false) return sqls[1]; return string.Join("\r\n\r\n;\r\n\r\n", sqls); - string getInsertSql(List data, bool flagInsert) + string getInsertSql(List data, bool flagInsert, bool noneParameter) { var insert = _orm.Insert() .AsTable(_tableRule).AsType(_table.Type) .WithConnection(_connection) .WithTransaction(_transaction) - .NoneParameter(true) as Internal.CommonProvider.InsertProvider; + .NoneParameter(noneParameter) as Internal.CommonProvider.InsertProvider; insert._source = data; insert._table = _table; insert._noneParameterFlag = flagInsert ? "cuc" : "cu"; diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsertOrUpdate.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsertOrUpdate.cs index 398f1006..28c545dc 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/Curd/OdbcSqlServerInsertOrUpdate.cs @@ -17,10 +17,11 @@ namespace FreeSql.Odbc.SqlServer public override string ToSql() { + var dbParams = new List(); + if (_sourceSql != null) return getMergeSql(null); if (_source?.Any() != true) return null; var sqls = new string[2]; - var dbParams = new List(); var ds = SplitSourceByIdentityValueIsNull(_source); if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getMergeSql(a))); if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a))); diff --git a/Providers/FreeSql.Provider.Oracle/Curd/OracleInsertOrUpdate.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsertOrUpdate.cs index 281af421..aac48225 100644 --- a/Providers/FreeSql.Provider.Oracle/Curd/OracleInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsertOrUpdate.cs @@ -17,10 +17,11 @@ namespace FreeSql.Oracle.Curd public override string ToSql() { + var dbParams = new List(); + if (_sourceSql != null) return getMergeSql(null); if (_source?.Any() != true) return null; var sqls = new string[2]; - var dbParams = new List(); var ds = SplitSourceByIdentityValueIsNull(_source); if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getMergeSql(a))); if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a))); diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs index bd7c6016..d543af7d 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsertOrUpdate.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data.Common; using System.Linq; +using System.Text; namespace FreeSql.PostgreSQL.Curd { @@ -15,25 +16,37 @@ namespace FreeSql.PostgreSQL.Curd public override string ToSql() { + var dbParams = new List(); + if (_sourceSql != null) + { + var data = new List(); + data.Add((T1)_table.Type.CreateInstanceGetDefaultValue()); + var sql = getInsertSql(data, false, false); + var sb = new StringBuilder(); + sb.Append(sql.Substring(0, sql.IndexOf(") VALUES"))); + sb.Append(") \r\n"); + WriteSourceSelectUnionAll(null, sb, null); + sb.Append(sql.Substring(sql.IndexOf("\r\nON CONFLICT(") + 2)); + return sb.ToString(); + } if (_source?.Any() != true) return null; var sqls = new string[2]; - var dbParams = new List(); var ds = SplitSourceByIdentityValueIsNull(_source); - if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getInsertSql(a, false))); - if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a, true))); + if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getInsertSql(a, false, true))); + if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a, true, true))); _params = dbParams.ToArray(); if (ds.Item2.Any() == false) return sqls[0]; if (ds.Item1.Any() == false) return sqls[1]; return string.Join("\r\n\r\n;\r\n\r\n", sqls); - string getInsertSql(List data, bool flagInsert) + string getInsertSql(List data, bool flagInsert, bool noneParameter) { var insert = _orm.Insert() .AsTable(_tableRule).AsType(_table.Type) .WithConnection(_connection) .WithTransaction(_transaction) - .NoneParameter(true) as Internal.CommonProvider.InsertProvider; + .NoneParameter(noneParameter) as Internal.CommonProvider.InsertProvider; insert._source = data; insert._table = _table; insert._noneParameterFlag = flagInsert ? "cuc" : "cu"; diff --git a/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongInsertOrUpdate.cs b/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongInsertOrUpdate.cs index 65ec4076..f938d5d7 100644 --- a/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.ShenTong/Curd/ShenTongInsertOrUpdate.cs @@ -17,10 +17,11 @@ namespace FreeSql.ShenTong.Curd public override string ToSql() { + var dbParams = new List(); + if (_sourceSql != null) return getMergeSql(null); if (_source?.Any() != true) return null; var sqls = new string[2]; - var dbParams = new List(); var ds = SplitSourceByIdentityValueIsNull(_source); if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getMergeSql(a))); if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a))); diff --git a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsertOrUpdate.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsertOrUpdate.cs index eca35376..04048ba9 100644 --- a/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsertOrUpdate.cs @@ -17,10 +17,11 @@ namespace FreeSql.SqlServer.Curd public override string ToSql() { + var dbParams = new List(); + if (_sourceSql != null) return getMergeSql(null); if (_source?.Any() != true) return null; var sqls = new string[2]; - var dbParams = new List(); var ds = SplitSourceByIdentityValueIsNull(_source); if (ds.Item1.Any()) sqls[0] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item1.Select(a => getMergeSql(a))); if (ds.Item2.Any()) sqls[1] = string.Join("\r\n\r\n;\r\n\r\n", ds.Item2.Select(a => getInsertSql(a))); diff --git a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsertOrUpdate.cs b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsertOrUpdate.cs index 8f6632ae..66608f4d 100644 --- a/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsertOrUpdate.cs +++ b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsertOrUpdate.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; +using System.Linq.Expressions; namespace FreeSql.Sqlite.Curd { @@ -14,6 +15,15 @@ namespace FreeSql.Sqlite.Curd { } + public override IInsertOrUpdate SetSource(string sql, Expression> tempPrimarys = null) + { + var list = _orm.Ado.CommandFluent(sql) + .WithConnection(_connection) + .WithTransaction(_transaction) + .Query(); + return SetSource(list, tempPrimarys); + } + public override string ToSql() { if (_source?.Any() != true) return null;