예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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());
        }
예제 #4
0
        /// <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));
        }
예제 #5
0
        /// <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();
            }
        }
예제 #6
0
 /// <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));
 }
예제 #7
0
 /// <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();
 }