public InsertClause(string table, Expression value, SelectClause query, OnConflictClause onConflict, LambdaExpression returning) { Table = table; Value = value; Query = query; OnConflict = onConflict; Returning = returning; }
/// <summary> /// Convierte la cláusura ON CONFLICT /// </summary> static string OnConflict(OnConflictClause onConf, ParamMode paramMode, SqlParamDic paramDic, string tableName) { var b = new StringBuilder(); //fromAlias es null ya que en la expresion de indice de ON CONFLICT no se permiten //los identificadores de las tablas, sólo se permiten los nombres tal cual de las columnas var pars = new SqlExprParams(null, null, false, null, new SqlFromList.ExprStrRawSql[0], paramMode, paramDic); var indexExpr = onConf .IndexExpressions .Select(x => SqlExpression.ExprToSql(x.Body, pars.ReplaceSelectParams(x.Parameters[0], null), true)) ; b.Append("ON CONFLICT "); if (indexExpr.Any()) { b.Append("("); b.Append(string.Join(", ", indexExpr)); b.Append(") "); } if (onConf.Where != null) { var whereSql = SqlExpression.ExprToSql(onConf.Where.Body, pars.ReplaceSelectParams(onConf.Where.Parameters[0], null), true); b.Append("WHERE "); b.Append(whereSql); } if (onConf.DoUpdate == null) { //Si DoUpdate es null se considera que es DO NOTHING b.Append("DO NOTHING"); } else { b.Append(OnConflictDoUpdate(onConf.DoUpdate, paramMode, paramDic, tableName)); } return(b.ToString()); }
public InsertClause SetOnConflict(OnConflictClause onConflict) => new InsertClause(Table, Value, Query, onConflict, Returning);