From e12f6e04a299f64a7afbfd51adb4f0d2dc8bcb72 Mon Sep 17 00:00:00 2001
From: 2881099 <2881099@qq.com>
Date: Wed, 17 Aug 2022 19:49:54 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20IInsertOrUpdate.SetSou?=
=?UTF-8?q?rce(sql)=20=E9=87=8D=E8=BD=BD=E6=96=B9=E6=B3=95=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql.DbContext/FreeSql.DbContext.xml | 9 +++
.../Internal/CommonExpressionTest.cs | 60 +++++++++----------
FreeSql.Tests/FreeSql.Tests/Issues/494.cs | 2 +-
.../MySql/Curd/MySqlInsertOrUpdateTest.cs | 13 +++-
.../Curd/PostgreSQLInsertOrUpdateTest.cs | 12 +++-
.../Curd/SqlServerInsertOrUpdateTest.cs | 13 +++-
FreeSql/FreeSql.xml | 7 +++
FreeSql/Interface/Curd/IInsertOrUpdate.cs | 2 +
FreeSql/Internal/CommonExpression.cs | 2 +-
.../CommonProvider/InsertOrUpdateProvider.cs | 22 +++++++
.../Curd/DamengInsertOrUpdate.cs | 3 +-
.../Curd/FirebirdInsertOrUpdate.cs | 3 +-
.../Curd/GBaseInsertOrUpdate.cs | 3 +-
.../Curd/KingbaseESInsertOrUpdate.cs | 23 +++++--
.../Curd/MySqlInsertOrUpdate.cs | 25 ++++++--
.../Dameng/Curd/OdbcDamengInsertOrUpdate.cs | 3 +-
.../Curd/OdbcKingbaseESInsertOrUpdate.cs | 22 +++++--
.../MySql/Curd/OdbcMySqlInsertOrUpdate.cs | 26 ++++++--
.../Oracle/Curd/OdbcOracleInsertOrUpdate.cs | 3 +-
.../Curd/OdbcPostgreSQLInsertOrUpdate.cs | 23 +++++--
.../Curd/OdbcSqlServerInsertOrUpdate.cs | 3 +-
.../Curd/OracleInsertOrUpdate.cs | 3 +-
.../Curd/PostgreSQLInsertOrUpdate.cs | 23 +++++--
.../Curd/ShenTongInsertOrUpdate.cs | 3 +-
.../Curd/SqlServerInsertOrUpdate.cs | 3 +-
.../Curd/SqliteInsertOrUpdate.cs | 10 ++++
26 files changed, 245 insertions(+), 76 deletions(-)
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;