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
}
}