using System.Collections.Generic; using System.Data; using System.Linq; using System.Threading.Tasks; using Dapper; using DapperExtensions.Mapper; using DapperExtensions.Sql; namespace DapperExtensions { /// /// /// public interface IDapperAsyncImplementor : IDapperImplementor { /// /// The asynchronous counterpart to . /// Task GetAsync(IDbConnection connection, dynamic id, IDbTransaction transaction = null, int? commandTimeout = null) where T : class; /// /// The asynchronous counterpart to . /// Task> GetListAsync(IDbConnection connection, object predicate = null, IList sort = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class; /// /// The asynchronous counterpart to . /// Task> GetPageAsync(IDbConnection connection, object predicate = null, IList sort = null, int page = 1, int resultsPerPage = 10, IDbTransaction transaction = null, int? commandTimeout = null) where T : class; /// /// The asynchronous counterpart to . /// Task> GetSetAsync(IDbConnection connection, object predicate = null, IList sort = null, int firstResult = 1, int maxResults = 10, IDbTransaction transaction = null, int? commandTimeout = null) where T : class; /// /// The asynchronous counterpart to . /// Task CountAsync(IDbConnection connection, object predicate = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class; } public class DapperAsyncImplementor : DapperImplementor, IDapperAsyncImplementor { /// /// Initializes a new instance of the class. /// /// The SQL generator. public DapperAsyncImplementor(ISqlGenerator sqlGenerator) :base(sqlGenerator) { } #region Implementation of IDapperAsyncImplementor /// /// The asynchronous counterpart to . /// public async Task GetAsync(IDbConnection connection, dynamic id, IDbTransaction transaction = null, int? commandTimeout = null) where T : class { IClassMapper classMap = SqlGenerator.Configuration.GetMap(); IPredicate predicate = GetIdPredicate(classMap, id); return (await GetListAsync(connection, classMap, predicate, null, transaction, commandTimeout)).SingleOrDefault(); } /// /// The asynchronous counterpart to . /// public async Task> GetListAsync(IDbConnection connection, object predicate = null, IList sort = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class { IClassMapper classMap = SqlGenerator.Configuration.GetMap(); IPredicate wherePredicate = GetPredicate(classMap, predicate); return await GetListAsync(connection, classMap, wherePredicate, sort, transaction, commandTimeout); } /// /// The asynchronous counterpart to . /// public async Task> GetPageAsync(IDbConnection connection, object predicate = null, IList sort = null, int page = 1, int resultsPerPage = 10, IDbTransaction transaction = null, int? commandTimeout = null) where T : class { IClassMapper classMap = SqlGenerator.Configuration.GetMap(); IPredicate wherePredicate = GetPredicate(classMap, predicate); return await GetPageAsync(connection, classMap, wherePredicate, sort, page, resultsPerPage, transaction, commandTimeout); } /// /// The asynchronous counterpart to . /// public async Task> GetSetAsync(IDbConnection connection, object predicate = null, IList sort = null, int firstResult = 1, int maxResults = 10, IDbTransaction transaction = null, int? commandTimeout = null) where T : class { IClassMapper classMap = SqlGenerator.Configuration.GetMap(); IPredicate wherePredicate = GetPredicate(classMap, predicate); return await GetSetAsync(connection, classMap, wherePredicate, sort, firstResult, maxResults, transaction, commandTimeout); } /// /// The asynchronous counterpart to . /// public async Task CountAsync(IDbConnection connection, object predicate = null, IDbTransaction transaction = null, int? commandTimeout = null) where T : class { IClassMapper classMap = SqlGenerator.Configuration.GetMap(); IPredicate wherePredicate = GetPredicate(classMap, predicate); Dictionary parameters = new Dictionary(); string sql = SqlGenerator.Count(classMap, wherePredicate, parameters); DynamicParameters dynamicParameters = new DynamicParameters(); foreach (var parameter in parameters) { dynamicParameters.Add(parameter.Key, parameter.Value); } return (int)(await connection.QueryAsync(sql, dynamicParameters, transaction, commandTimeout, CommandType.Text)).Single().Total; } #endregion #region Helpers /// /// The asynchronous counterpart to . /// protected async Task> GetListAsync(IDbConnection connection, IClassMapper classMap, IPredicate predicate, IList sort, IDbTransaction transaction, int? commandTimeout) where T : class { Dictionary parameters = new Dictionary(); string sql = SqlGenerator.Select(classMap, predicate, sort, parameters); DynamicParameters dynamicParameters = new DynamicParameters(); foreach (var parameter in parameters) { dynamicParameters.Add(parameter.Key, parameter.Value); } return await connection.QueryAsync(sql, dynamicParameters, transaction, commandTimeout, CommandType.Text); } /// /// The asynchronous counterpart to . /// protected async Task> GetPageAsync(IDbConnection connection, IClassMapper classMap, IPredicate predicate, IList sort, int page, int resultsPerPage, IDbTransaction transaction, int? commandTimeout) where T : class { Dictionary parameters = new Dictionary(); string sql = SqlGenerator.SelectPaged(classMap, predicate, sort, page, resultsPerPage, parameters); DynamicParameters dynamicParameters = new DynamicParameters(); foreach (var parameter in parameters) { dynamicParameters.Add(parameter.Key, parameter.Value); } return await connection.QueryAsync(sql, dynamicParameters, transaction, commandTimeout, CommandType.Text); } /// /// The asynchronous counterpart to . /// protected async Task> GetSetAsync(IDbConnection connection, IClassMapper classMap, IPredicate predicate, IList sort, int firstResult, int maxResults, IDbTransaction transaction, int? commandTimeout) where T : class { Dictionary parameters = new Dictionary(); string sql = SqlGenerator.SelectSet(classMap, predicate, sort, firstResult, maxResults, parameters); DynamicParameters dynamicParameters = new DynamicParameters(); foreach (var parameter in parameters) { dynamicParameters.Add(parameter.Key, parameter.Value); } return await connection.QueryAsync(sql, dynamicParameters, transaction, commandTimeout, CommandType.Text); } #endregion } }