using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using Dapper; namespace CQRS_Simple.Infrastructure.Dapper { public class DapperRepository : IDapperRepository where T : Entity { private readonly ISqlConnectionFactory _sqlConnectionFactory; private readonly string _tableName; public DapperRepository(ISqlConnectionFactory sqlConnectionFactory) { _sqlConnectionFactory = sqlConnectionFactory; var attr = typeof(T).GetCustomAttributes(typeof(TableAttribute), true).FirstOrDefault(); _tableName = (attr as TableAttribute)?.Name; } public async Task GetByIdAsync(TC id) { using var db = _sqlConnectionFactory.GetOpenConnection(); return await db.QueryFirstOrDefaultAsync( $"SELECT * FROM {_tableName} WHERE Id=@Id", new { Id = id }); } public async Task AddAsync(T item) { using var db = _sqlConnectionFactory.GetOpenConnection(); return await db.InsertAsync(_tableName, item); } public async Task RemoveAsync(T item) { using var db = _sqlConnectionFactory.GetOpenConnection(); return await db.ExecuteAsync( $"DELETE FROM {_tableName} WHERE Id=@Id", new { Id = item.Id }); } public async Task UpdateAsync(T item) { using var db = _sqlConnectionFactory.GetOpenConnection(); return await db.UpdateAsync(_tableName, item); } public async Task> FindAsync(Expression> predicate) { IEnumerable items; var result = DynamicQuery.GetDynamicQuery(_tableName, predicate); using (var db = _sqlConnectionFactory.GetOpenConnection()) { items = await db.QueryAsync(result.Sql, (object)result.Param); } return items; } public async Task> GetAllAsync() { IEnumerable items; using (var db = _sqlConnectionFactory.GetOpenConnection()) { items = await db.QueryAsync( $"SELECT * FROM {_tableName}" ); } return items; } } }