Skip to content

Commit 63612d2

Browse files
2881028810
authored andcommitted
- 完善 PgSql OnConflictDoUpdate 功能增加 DO NOTHING 操作;#174
1 parent 255593a commit 63612d2

File tree

2 files changed

+172
-27
lines changed

2 files changed

+172
-27
lines changed

FreeSql/FreeSql.xml

Lines changed: 131 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Providers/FreeSql.Provider.PostgreSQL/Curd/OnConflictDoUpdate.cs

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class OnConflictDoUpdate<T1> where T1 : class
2121
(_pgsqlUpdatePriv = new PostgreSQLUpdate<T1>(_pgsqlInsert.InternalOrm, _pgsqlInsert.InternalCommonUtils, _pgsqlInsert.InternalCommonExpression, null) { InternalTableAlias = "EXCLUDED" }
2222
.NoneParameter().SetSource(_pgsqlInsert.InternalSource) as PostgreSQLUpdate<T1>);
2323
ColumnInfo[] _columns;
24+
bool _doNothing;
2425

2526
public OnConflictDoUpdate(IInsert<T1> insert, Expression<Func<T1, object>> columns = null)
2627
{
@@ -86,6 +87,12 @@ public OnConflictDoUpdate<T1> SetRaw(string sql)
8687
return this;
8788
}
8889

90+
public OnConflictDoUpdate<T1> DoNothing()
91+
{
92+
_doNothing = true;
93+
return this;
94+
}
95+
8996
public string ToSql()
9097
{
9198
var sb = new StringBuilder();
@@ -95,41 +102,48 @@ public string ToSql()
95102
if (a > 0) sb.Append(", ");
96103
sb.Append(_pgsqlInsert.InternalCommonUtils.QuoteSqlName(_columns[a].Attribute.Name));
97104
}
98-
sb.Append(") DO UPDATE SET\r\n");
99-
100-
var sbSetEmpty = _pgsqlUpdate.InternalSbSet.Length == 0;
101-
var sbSetIncrEmpty = _pgsqlUpdate.InternalSbSetIncr.Length == 0;
102-
if (sbSetEmpty == false || sbSetIncrEmpty == false)
105+
if (_doNothing)
103106
{
104-
if (sbSetEmpty == false) sb.Append(_pgsqlUpdate.InternalSbSet.ToString().Substring(2));
105-
if (sbSetIncrEmpty == false) sb.Append(sbSetEmpty ? _pgsqlUpdate.InternalSbSetIncr.ToString().Substring(2) : _pgsqlUpdate.InternalSbSetIncr.ToString());
107+
sb.Append(") DO NOTHING");
106108
}
107109
else
108110
{
109-
var colidx = 0;
110-
foreach (var col in _pgsqlInsert.InternalTable.Columns.Values)
111+
sb.Append(") DO UPDATE SET\r\n");
112+
113+
var sbSetEmpty = _pgsqlUpdate.InternalSbSet.Length == 0;
114+
var sbSetIncrEmpty = _pgsqlUpdate.InternalSbSetIncr.Length == 0;
115+
if (sbSetEmpty == false || sbSetIncrEmpty == false)
111116
{
112-
if (col.Attribute.IsPrimary || _pgsqlUpdate.InternalIgnore.ContainsKey(col.Attribute.Name)) continue;
117+
if (sbSetEmpty == false) sb.Append(_pgsqlUpdate.InternalSbSet.ToString().Substring(2));
118+
if (sbSetIncrEmpty == false) sb.Append(sbSetEmpty ? _pgsqlUpdate.InternalSbSetIncr.ToString().Substring(2) : _pgsqlUpdate.InternalSbSetIncr.ToString());
119+
}
120+
else
121+
{
122+
var colidx = 0;
123+
foreach (var col in _pgsqlInsert.InternalTable.Columns.Values)
124+
{
125+
if (col.Attribute.IsPrimary || _pgsqlUpdate.InternalIgnore.ContainsKey(col.Attribute.Name)) continue;
113126

114-
if (colidx > 0) sb.Append(", \r\n");
127+
if (colidx > 0) sb.Append(", \r\n");
115128

116-
if (col.Attribute.IsVersion == true)
117-
{
118-
var field = _pgsqlInsert.InternalCommonUtils.QuoteSqlName(col.Attribute.Name);
119-
sb.Append(field).Append(" = ").Append(_pgsqlInsert.InternalCommonUtils.QuoteSqlName(_pgsqlInsert.InternalTable.DbName)).Append(".").Append(field).Append(" + 1");
120-
}
121-
else if (_pgsqlInsert.InternalIgnore.ContainsKey(col.Attribute.Name))
122-
{
123-
var caseWhen = _pgsqlUpdate.InternalWhereCaseSource(col.CsName, sqlval => sqlval).Trim();
124-
sb.Append(caseWhen);
125-
if (caseWhen.EndsWith(" END")) _pgsqlUpdate.InternalToSqlCaseWhenEnd(sb, col);
126-
}
127-
else
128-
{
129-
var field = _pgsqlInsert.InternalCommonUtils.QuoteSqlName(col.Attribute.Name);
130-
sb.Append(field).Append(" = EXCLUDED.").Append(field);
129+
if (col.Attribute.IsVersion == true)
130+
{
131+
var field = _pgsqlInsert.InternalCommonUtils.QuoteSqlName(col.Attribute.Name);
132+
sb.Append(field).Append(" = ").Append(_pgsqlInsert.InternalCommonUtils.QuoteSqlName(_pgsqlInsert.InternalTable.DbName)).Append(".").Append(field).Append(" + 1");
133+
}
134+
else if (_pgsqlInsert.InternalIgnore.ContainsKey(col.Attribute.Name))
135+
{
136+
var caseWhen = _pgsqlUpdate.InternalWhereCaseSource(col.CsName, sqlval => sqlval).Trim();
137+
sb.Append(caseWhen);
138+
if (caseWhen.EndsWith(" END")) _pgsqlUpdate.InternalToSqlCaseWhenEnd(sb, col);
139+
}
140+
else
141+
{
142+
var field = _pgsqlInsert.InternalCommonUtils.QuoteSqlName(col.Attribute.Name);
143+
sb.Append(field).Append(" = EXCLUDED.").Append(field);
144+
}
145+
++colidx;
131146
}
132-
++colidx;
133147
}
134148
}
135149

0 commit comments

Comments
 (0)