/// <summary> /// Performs an update for the specified stored procedure and value (reselects where specified). /// </summary> /// <typeparam name="T">The value <see cref="Type"/>.</typeparam> /// <param name="saveArgs">The <see cref="DatabaseArgs{T}"/>.</param> /// <param name="value">The value to update.</param> /// <returns>The value (reselected where specified).</returns> /// <remarks>Automatically invokes <see cref="DatabaseParameters.AddRowVersionParameter{T}(T, ParameterDirection)"/> and <see cref="DatabaseParameters.AddChangeLogParameters{T}(T, bool, bool, ParameterDirection)"/>.</remarks> public async Task <T> UpdateAsync <T>(DatabaseArgs <T> saveArgs, T value) where T : class, new() { if (value == null) { throw new ArgumentNullException(nameof(value)); } if (saveArgs == null) { throw new ArgumentNullException(nameof(saveArgs)); } var cmd = StoredProcedure(saveArgs.StoredProcedure); saveArgs.Mapper.GetKeyParams(cmd.Parameters, OperationTypes.Update, value); cmd.Params(value, saveArgs.Mapper.MapToDb, OperationTypes.Update); if (saveArgs.Refresh) { cmd.Param("@" + DatabaseColumns.ReselectRecordName, true); return(await cmd.SelectFirstOrDefaultAsync(saveArgs.Mapper).ConfigureAwait(false) ?? throw new NotFoundException()); } // NOTE: without refresh, fields like IDs and RowVersion are not automatically updated. await cmd.NonQueryAsync().ConfigureAwait(false); return(value); }
/// <summary> /// Initializes a new instance of the <see cref="DatabaseQuery{T}"/> class. /// </summary> /// <param name="database">The <see cref="DatabaseBase"/>.</param> /// <param name="queryArgs">The <see cref="IDatabaseArgs"/>.</param> /// <param name="queryParams">The query <see cref="DatabaseParameters"/> action/delegate.</param> internal DatabaseQuery(DatabaseBase database, DatabaseArgs <T> queryArgs, Action <DatabaseParameters> queryParams) { var db = database ?? throw new ArgumentNullException(nameof(database)); QueryArgs = queryArgs ?? throw new ArgumentNullException(nameof(queryArgs)); Command = db.StoredProcedure(QueryArgs.StoredProcedure).Params(queryParams); }
/// <summary> /// Performs a delete for the specified <paramref name="keys"/>. /// </summary> /// <typeparam name="T">The value <see cref="Type"/>.</typeparam> /// <param name="saveArgs">The <see cref="DatabaseArgs{T}"/>.</param> /// <param name="keys">The key values.</param> public Task DeleteAsync <T>(DatabaseArgs <T> saveArgs, params IComparable[] keys) where T : class, new() { if (saveArgs == null) { throw new ArgumentNullException(nameof(saveArgs)); } return(StoredProcedure(saveArgs.StoredProcedure).Params((p) => saveArgs.Mapper.GetKeyParams(p, OperationTypes.Delete, keys)).NonQueryAsync()); }
/// <summary> /// Gets the entity for the specified <paramref name="keys"/> mapping to <typeparamref name="T"/>. /// </summary> /// <typeparam name="T">The resultant <see cref="Type"/>.</typeparam> /// <param name="getArgs">The <see cref="DatabaseArgs{T}"/>.</param> /// <param name="keys">The key values.</param> /// <returns>The entity value where found; otherwise, <c>null</c>.</returns> public Task <T?> GetAsync <T>(DatabaseArgs <T> getArgs, params IComparable[] keys) where T : class, new() { if (getArgs == null) { throw new ArgumentNullException(nameof(getArgs)); } return(StoredProcedure(getArgs.StoredProcedure).Params((p) => getArgs.Mapper.GetKeyParams(p, OperationTypes.Get, keys)).SelectFirstOrDefaultAsync <T>(getArgs.Mapper)); }
/// <summary> /// Performs a delete for the specified <paramref name="keys"/>. /// </summary> /// <typeparam name="T">The value <see cref="Type"/>.</typeparam> /// <param name="saveArgs">The <see cref="DatabaseArgs{T}"/>.</param> /// <param name="keys">The key values.</param> public async Task DeleteAsync <T>(DatabaseArgs <T> saveArgs, params IComparable[] keys) where T : class, new() { if (saveArgs == null) { throw new ArgumentNullException(nameof(saveArgs)); } var rowsAffected = await StoredProcedure(saveArgs.StoredProcedure).Params((p) => saveArgs.Mapper.GetKeyParams(p, OperationTypes.Delete, keys)).NonQueryAsync().ConfigureAwait(false); if (rowsAffected == 0) { throw new NotFoundException(); } }
/// <summary> /// Creates a <see cref="DatabaseQuery{T}"/> to enable select-like capabilities. /// </summary> /// <param name="queryArgs">The <see cref="DatabaseArgs{T}"/>.</param> /// <param name="queryParams">The query <see cref="DatabaseParameters"/> delegate.</param> /// <returns>A <see cref="DatabaseQuery{T}"/>.</returns> public DatabaseQuery <T> Query <T>(DatabaseArgs <T> queryArgs, Action <DatabaseParameters>?queryParams = null) where T : class, new() { return(new DatabaseQuery <T>(this, queryArgs, queryParams)); }
/// <summary> /// Performs a delete for the specified <paramref name="keys"/>. /// </summary> /// <typeparam name="T">The value <see cref="Type"/>.</typeparam> /// <param name="saveArgs">The <see cref="DatabaseArgs{T}"/>.</param> /// <param name="keys">The key values.</param> public void Delete <T>(DatabaseArgs <T> saveArgs, params IComparable[] keys) where T : class, new() { StoredProcedure(saveArgs.StoredProcedure).Params((p) => saveArgs.Mapper.GetKeyParams(p, OperationTypes.Delete, keys)).NonQuery(); }