I would suggest this repository template:
public class Repository { private readonly string _connectionString; public Repository(string connectionString) { _connectionString = connectionString; } protected T GetConnection<T>(Func<IDbConnection, T> getData) { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); return getData(connection); } } protected TResult GetConnection<TRead, TResult>(Func<IDbConnection, TRead> getData, Func<TRead, TResult> process) { using (var connection = new SqlConnection(_connectionString)) { connection.Open(); var data = getData(connection); return process(data); } } }
For buffered requests, you want to use the first overload of the GetConnection method, for non- GetConnection , you use the second, specifying a callback to process the data:
public class MyRepository : Repository { public MyRepository(string connectionString) : base(connectionString) { } public IEnumerable<MyMapObject> GetData() { return GetConnection(c => c.Query<MyMapObject>(query)); } public IEnumerable<ResultObject> GetLotsOfData(Func<IEnumerable<MyMapObject>, IEnumerable<ResultObject>> process) { return GetConnection(c => c.Query<MyMapObject>(query, buffered: false), process); } }
Very simple use:
static void Main(string[] args) { var repository = new MyRepository(connectionString); var data = repository.GetLotsOfData(ProcessData); } public static IEnumerable<ResultObject> ProcessData(IEnumerable<MyMapObject> data) { foreach (var record in data) { var result = new ResultObject();
But keep in mind - the connection may be open too long in this case ...
Sergio
source share