public virtual OperationBuilder <DeleteDataOperation> DeleteData( [NotNull] string table, [NotNull] string[] keyColumns, [NotNull] object[,] keyValues, [CanBeNull] string schema = null) { Check.NotEmpty(table, nameof(table)); Check.NotNull(keyColumns, nameof(keyColumns)); Check.NotNull(keyValues, nameof(keyValues)); var operation = new DeleteDataOperation { Table = table, Schema = schema, KeyColumns = keyColumns, KeyValues = keyValues }; Operations.Add(operation); return(new OperationBuilder <DeleteDataOperation>(operation)); }
protected virtual void Generate( [NotNull] DeleteDataOperation operation, [CanBeNull] IModel model, [NotNull] MigrationCommandListBuilder builder) { Check.NotNull(operation, nameof(operation)); Check.NotNull(builder, nameof(builder)); if (operation.KeyValues.Length == 0) { return; } builder .Append("DELETE FROM ") .AppendLine(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema)); builder.Append("WHERE "); var rowCount = operation.KeyValues.GetLength(0); var valueCount = operation.KeyValues.GetLength(1); for (var i = 0; i < rowCount; i++) { if (i != 0) { builder .AppendLine(" OR") .Append(" "); } builder.Append("("); for (var j = 0; j < valueCount; j++) { if (j != 0) { builder.Append(" AND "); } builder.Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.KeyColumns[j])); var value = operation.KeyValues[i, j]; if (value == null) { builder.Append(" IS NULL"); } else { var typeMapping = Dependencies.TypeMapper.GetMappingForValue(value); builder .Append(" = ") .Append(typeMapping.GenerateSqlLiteral(value)); } } builder.Append(")"); } builder.AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); EndStatement(builder); }