////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// An IDbConnection extension method that executes the reader asynchronous operation.
        /// </summary>
        ///
        /// <remarks>   Msacli, 22.04.2019. </remarks>
        ///
        /// <param name="connection">       The connection to act on. </param>
        /// <param name="sql">              The SQL. </param>
        /// <param name="commandType">      (Optional) Type of the command. </param>
        /// <param name="transaction">      (Optional) The transaction. </param>
        /// <param name="inputParameters">  (Optional) Options for controlling the input. </param>
        /// <param name="outputParameters"> (Optional) Options for controlling the output. </param>
        ///
        /// <returns>   An asynchronous result that yields the execute reader. </returns>
        ////////////////////////////////////////////////////////////////////////////////////////////////////
        public static Task <IDataReader> ExecuteReaderAsync(this IDbConnection connection,
                                                            string sql, CommandType commandType          = CommandType.Text,
                                                            IDbTransaction transaction                   = null,
                                                            Dictionary <string, object> inputParameters  = null,
                                                            Dictionary <string, object> outputParameters = null)
        {
            var resultTask = Task.Factory.StartNew(() =>
            {
                return(DxConnectionOperationExtension.ExecuteReader(connection,
                                                                    sql,
                                                                    commandType,
                                                                    transaction,
                                                                    inputParameters,
                                                                    outputParameters));
            });

            return(resultTask);
        }
        ////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>   An IDbConnection extension method that first as dynamic asynchronous. </summary>
        ///
        /// <remarks>   Msacli, 22.04.2019. </remarks>
        ///
        /// <param name="connection">       The connection to act on. </param>
        /// <param name="sqlText">          The SQL text. </param>
        /// <param name="commandType">      (Optional) Type of the command. </param>
        /// <param name="transaction">      (Optional) The transaction. </param>
        /// <param name="inputParameters">  (Optional) Options for controlling the input. </param>
        /// <param name="outputParameters"> (Optional) Options for controlling the output. </param>
        ///
        /// <returns>   An asynchronous result that yields the first as dynamic. </returns>
        ////////////////////////////////////////////////////////////////////////////////////////////////////
        public static Task <ExpandoObject> FirstAsDynamicAsync(this IDbConnection connection,
                                                               string sqlText, CommandType commandType = CommandType.Text,
                                                               IDbTransaction transaction = null,
                                                               Dictionary <string, object> inputParameters  = null,
                                                               Dictionary <string, object> outputParameters = null)
        {
            var resultTask = Task.Factory.StartNew(() =>
            {
                return(DxConnectionOperationExtension.FirstAsDynamic(connection,
                                                                     sqlText,
                                                                     commandType,
                                                                     transaction,
                                                                     inputParameters,
                                                                     outputParameters));
            });

            return(resultTask);
        }
        ////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>   An IDbConnection extension method that last asynchronous. </summary>
        ///
        /// <remarks>   Msacli, 22.04.2019. </remarks>
        ///
        /// <typeparam name="T">    Generic type parameter. </typeparam>
        /// <param name="connection">       The connection to act on. </param>
        /// <param name="sqlText">          The SQL text. </param>
        /// <param name="commandType">      (Optional) Type of the command. </param>
        /// <param name="transaction">      (Optional) The transaction. </param>
        /// <param name="inputParameters">  (Optional) Options for controlling the input. </param>
        /// <param name="outputParameters"> (Optional) Options for controlling the output. </param>
        ///
        /// <returns>   An asynchronous result that yields a T. </returns>
        ////////////////////////////////////////////////////////////////////////////////////////////////////
        public static Task <T> LastAsync <T>(this IDbConnection connection,
                                             string sqlText, CommandType commandType = CommandType.Text,
                                             IDbTransaction transaction = null,
                                             Dictionary <string, object> inputParameters  = null,
                                             Dictionary <string, object> outputParameters = null) where T : class
        {
            var resultTask = Task.Factory.StartNew(() =>
            {
                return(DxConnectionOperationExtension.Last <T>(connection,
                                                               sqlText,
                                                               commandType,
                                                               transaction,
                                                               inputParameters,
                                                               outputParameters));
            });

            return(resultTask);
        }
        ////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// An IDbConnection extension method that gets dynamic result set with paging asynchronous.
        /// </summary>
        ///
        /// <remarks>   Msacli, 22.04.2019. </remarks>
        ///
        /// <param name="connection">       The connection to act on. </param>
        /// <param name="sql">              The SQL. </param>
        /// <param name="commandType">      Type of the command. </param>
        /// <param name="transaction">      (Optional) The transaction. </param>
        /// <param name="inputParameters">  (Optional) Options for controlling the input. </param>
        /// <param name="outputParameters"> (Optional) Options for controlling the output. </param>
        /// <param name="pageNumber">       (Optional) The page number. </param>
        /// <param name="pageItemCount">    (Optional) Number of page ıtems. </param>
        ///
        /// <returns>   An asynchronous result that yields the dynamic result set with paging. </returns>
        ////////////////////////////////////////////////////////////////////////////////////////////////////
        public static Task <List <ExpandoObject> > GetDynamicResultSetWithPagingAsync(this IDbConnection connection,
                                                                                      string sql, CommandType commandType,
                                                                                      IDbTransaction transaction = null,
                                                                                      Dictionary <string, object> inputParameters  = null,
                                                                                      Dictionary <string, object> outputParameters = null,
                                                                                      uint pageNumber = 1, uint pageItemCount = 10)
        {
            var resultTask = Task.Factory.StartNew(() =>
            {
                return(DxConnectionOperationExtension.GetDynamicResultSetWithPaging(connection,
                                                                                    sql,
                                                                                    commandType,
                                                                                    transaction,
                                                                                    inputParameters,
                                                                                    outputParameters));
            });

            return(resultTask);
        }