I currently have a method in my repository that will run SQL and map the reader to objects:
protected IEnumerable<T> Query<T, TFactory>(string sql, List<IDbDataParameter> parameters = null) where TFactory : IFactory<T>
{
List<T> list = new List<T>();
var factory = Activator.CreateInstance<TFactory>();
var connection = (Db == null) ? Connection : Db.Connection;
using (var manager = new DbCommandManager(connection, sql))
{
if (parameters != null)
foreach (var parameter in parameters)
manager.AddParameter(parameter);
using (var reader = manager.GetReader())
{
while(reader.Read())
list.Add(factory.CreateTFromReader(reader));
}
}
return list;
}
To use the following you simply do:
public IEnumerable<Code> GetCodeWType(string CodeType, string Code)
{
var sql = @"Select CODE_TYPE, CODE, DESCRIPTION From Codes Where (CODE_TYPE = :1) AND (CODE = :2)";
var parameters = new List<IDbDataParameter>();
parameters.Add(DbFactory.GetParameter(":1", CodeType, DbType.String));
parameters.Add(DbFactory.GetParameter(":2", Code, DbType.String));
return this.Query<Code, CodeFactory>(sql, parameters);
}
I would love to hear thoughts and feedback on how I can improve.