/// <inheritdoc />
        public SqlCommand MakeDeleteByPrimaryKeyCommand(object id, TableSchema tableSchema)
        {
            var sql         = new SqlCommandBuilder("DELETE FROM ").Append(tableSchema.Name);
            var primaryKeys = tableSchema.GetPrimaryKeys();

            sql.AppendWherePrimaryKeysClause(primaryKeys);
            return(sql.ToPrimaryKeySql(tableSchema, id));
        }
        /// <inheritdoc />
        public SqlCommand MakeDeleteCommand(object entity, TableSchema tableSchema)
        {
            Ensure.NotNull(entity, nameof(entity));

            var sql = new SqlCommandBuilder("DELETE FROM ").Append(tableSchema.Name);

            sql.AppendWherePrimaryKeysClause(tableSchema.GetPrimaryKeys());
            return(sql.ToCommand(entity));
        }
        /// <inheritdoc />
        public SqlCommand MakeFindCommand(object id, TableSchema tableSchema)
        {
            Ensure.NotNull(id, nameof(id));
            var primaryKeys = tableSchema.GetPrimaryKeys();

            var sql = new SqlCommandBuilder("SELECT ").AppendSelectPropertiesClause(tableSchema.Columns);

            sql.AppendClause("FROM ").Append(tableSchema.Name);
            sql.AppendWherePrimaryKeysClause(primaryKeys);
            return(sql.ToPrimaryKeySql(tableSchema, id));
        }
        public SqlMultipleCommand <TEntity> MakeUpdateRangeCommand <TEntity>(IEnumerable <TEntity> entities, TableSchema tableSchema)
            where TEntity : class
        {
            bool Include(ColumnSchema p) => p.Usage.IncludeInUpdateStatements;

            var sql = new SqlCommandBuilder("UPDATE ").Append(tableSchema.Name);

            sql.AppendClause("SET ").AppendColumnNamesEqualParameters(tableSchema.Columns, ", ", Include);
            sql.AppendWherePrimaryKeysClause(tableSchema.GetPrimaryKeys());
            return(sql.ToMultipleCommand(entities));
        }
        /// <inheritdoc />
        public SqlCommand MakeUpdateCommand(object entity, TableSchema tableSchema)
        {
            Ensure.NotNull(entity, nameof(entity));

            bool Include(ColumnSchema p) => p.Usage.IncludeInUpdateStatements;

            var sql = new SqlCommandBuilder("UPDATE ").Append(tableSchema.Name);

            sql.AppendClause("SET ").AppendColumnNamesEqualParameters(tableSchema.Columns, ", ", Include);
            sql.AppendWherePrimaryKeysClause(tableSchema.GetPrimaryKeys());
            return(sql.ToCommand(entity));
        }
        public SqlCommand ToPrimaryKeySql(TableSchema schema, object value)
        {
            var primaryKeys = schema.GetPrimaryKeys();

            if (primaryKeys.Length == 1)
            {
                return(this.ToCommand(new Dictionary <string, object>
                {
                    [primaryKeys.Single().ParameterName] = value
                }));
            }

            return(this.ToCommand(value));
        }
 /// <summary>
 /// Appends a WHERE clause which selects equality of primary keys.
 /// </summary>
 public static void AppendWherePrimaryKeysClause(this StringBuilder sql, TableSchema tableSchema)
 {
     sql.AppendClause("WHERE ")
     .AppendColumnNamesEqualParameterNames(tableSchema.GetPrimaryKeys(), " AND ", p => true);
 }