From 63612d20fdbcc9bef02c5b55a526eb8ade4ed925 Mon Sep 17 00:00:00 2001
From: 28810 <28810@YEXIANGQIN>
Date: Tue, 31 Dec 2019 22:49:49 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E5=AE=8C=E5=96=84=20PgSql=20OnConflictDoUp?=
=?UTF-8?q?date=20=E5=8A=9F=E8=83=BD=E5=A2=9E=E5=8A=A0=20DO=20NOTHING=20?=
=?UTF-8?q?=E6=93=8D=E4=BD=9C=EF=BC=9B#174?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql/FreeSql.xml | 131 ++++++++++++++++++
.../Curd/OnConflictDoUpdate.cs | 68 +++++----
2 files changed, 172 insertions(+), 27 deletions(-)
diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index 947162a6..59e0a2ec 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -2255,6 +2255,137 @@
+
+
+ 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
+
+
+
+
+
+
+
+
+ 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 })
+
+
+
+
+
+
+ 查询
+
+
+
+
+
+
+ 查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 })
+
+
+
+
+
+
+
+ 查询
+
+
+
+
+
+
+ 查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 })
+
+
+
+
+
+
+
+ 查询
+
+
+
+
+
+
+ 查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 })
+
+
+
+
+
+
+
+ 在【主库】执行
+
+
+
+
+
+
+
+ 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 })
+
+
+
+
+
+
+
+ 在【主库】执行
+
+
+
+
+
+
+
+ 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 })
+
+
+
+
+
+
+
+ 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 })
+
+
+
+
+
+
+
+
+
+ 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 })
+
+
+
+
+
+
+
+
+ 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 })
+
+
+
+
+
+
+
+
+
+ 执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new { age = 25 })
+
+
+
+
+
+
可自定义解析表达式
diff --git a/Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs
index 2e1dd474..bedded9d 100644
--- a/Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs
+++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs
@@ -21,6 +21,7 @@ namespace FreeSql.PostgreSQL.Curd
(_pgsqlUpdatePriv = new PostgreSQLUpdate(_pgsqlInsert.InternalOrm, _pgsqlInsert.InternalCommonUtils, _pgsqlInsert.InternalCommonExpression, null) { InternalTableAlias = "EXCLUDED" }
.NoneParameter().SetSource(_pgsqlInsert.InternalSource) as PostgreSQLUpdate);
ColumnInfo[] _columns;
+ bool _doNothing;
public OnConflictDoUpdate(IInsert insert, Expression> columns = null)
{
@@ -86,6 +87,12 @@ namespace FreeSql.PostgreSQL.Curd
return this;
}
+ public OnConflictDoUpdate DoNothing()
+ {
+ _doNothing = true;
+ return this;
+ }
+
public string ToSql()
{
var sb = new StringBuilder();
@@ -95,41 +102,48 @@ namespace FreeSql.PostgreSQL.Curd
if (a > 0) sb.Append(", ");
sb.Append(_pgsqlInsert.InternalCommonUtils.QuoteSqlName(_columns[a].Attribute.Name));
}
- sb.Append(") DO UPDATE SET\r\n");
-
- var sbSetEmpty = _pgsqlUpdate.InternalSbSet.Length == 0;
- var sbSetIncrEmpty = _pgsqlUpdate.InternalSbSetIncr.Length == 0;
- if (sbSetEmpty == false || sbSetIncrEmpty == false)
+ if (_doNothing)
{
- if (sbSetEmpty == false) sb.Append(_pgsqlUpdate.InternalSbSet.ToString().Substring(2));
- if (sbSetIncrEmpty == false) sb.Append(sbSetEmpty ? _pgsqlUpdate.InternalSbSetIncr.ToString().Substring(2) : _pgsqlUpdate.InternalSbSetIncr.ToString());
+ sb.Append(") DO NOTHING");
}
else
{
- var colidx = 0;
- foreach (var col in _pgsqlInsert.InternalTable.Columns.Values)
+ sb.Append(") DO UPDATE SET\r\n");
+
+ var sbSetEmpty = _pgsqlUpdate.InternalSbSet.Length == 0;
+ var sbSetIncrEmpty = _pgsqlUpdate.InternalSbSetIncr.Length == 0;
+ if (sbSetEmpty == false || sbSetIncrEmpty == false)
{
- if (col.Attribute.IsPrimary || _pgsqlUpdate.InternalIgnore.ContainsKey(col.Attribute.Name)) continue;
+ if (sbSetEmpty == false) sb.Append(_pgsqlUpdate.InternalSbSet.ToString().Substring(2));
+ if (sbSetIncrEmpty == false) sb.Append(sbSetEmpty ? _pgsqlUpdate.InternalSbSetIncr.ToString().Substring(2) : _pgsqlUpdate.InternalSbSetIncr.ToString());
+ }
+ else
+ {
+ var colidx = 0;
+ foreach (var col in _pgsqlInsert.InternalTable.Columns.Values)
+ {
+ if (col.Attribute.IsPrimary || _pgsqlUpdate.InternalIgnore.ContainsKey(col.Attribute.Name)) continue;
- if (colidx > 0) sb.Append(", \r\n");
+ if (colidx > 0) sb.Append(", \r\n");
- if (col.Attribute.IsVersion == true)
- {
- var field = _pgsqlInsert.InternalCommonUtils.QuoteSqlName(col.Attribute.Name);
- sb.Append(field).Append(" = ").Append(_pgsqlInsert.InternalCommonUtils.QuoteSqlName(_pgsqlInsert.InternalTable.DbName)).Append(".").Append(field).Append(" + 1");
+ if (col.Attribute.IsVersion == true)
+ {
+ var field = _pgsqlInsert.InternalCommonUtils.QuoteSqlName(col.Attribute.Name);
+ sb.Append(field).Append(" = ").Append(_pgsqlInsert.InternalCommonUtils.QuoteSqlName(_pgsqlInsert.InternalTable.DbName)).Append(".").Append(field).Append(" + 1");
+ }
+ else if (_pgsqlInsert.InternalIgnore.ContainsKey(col.Attribute.Name))
+ {
+ var caseWhen = _pgsqlUpdate.InternalWhereCaseSource(col.CsName, sqlval => sqlval).Trim();
+ sb.Append(caseWhen);
+ if (caseWhen.EndsWith(" END")) _pgsqlUpdate.InternalToSqlCaseWhenEnd(sb, col);
+ }
+ else
+ {
+ var field = _pgsqlInsert.InternalCommonUtils.QuoteSqlName(col.Attribute.Name);
+ sb.Append(field).Append(" = EXCLUDED.").Append(field);
+ }
+ ++colidx;
}
- else if (_pgsqlInsert.InternalIgnore.ContainsKey(col.Attribute.Name))
- {
- var caseWhen = _pgsqlUpdate.InternalWhereCaseSource(col.CsName, sqlval => sqlval).Trim();
- sb.Append(caseWhen);
- if (caseWhen.EndsWith(" END")) _pgsqlUpdate.InternalToSqlCaseWhenEnd(sb, col);
- }
- else
- {
- var field = _pgsqlInsert.InternalCommonUtils.QuoteSqlName(col.Attribute.Name);
- sb.Append(field).Append(" = EXCLUDED.").Append(field);
- }
- ++colidx;
}
}