private static async Task <IEnumerable <TResult> > RetrieveImplemenationAsync <TResult>(string operation, OperationType operationType, IList <Param> parameters, OperationReturnType returnType, string connectionName, DbConnection connection, Func <object[], TResult> map = null, IList <Type> types = null, MaterializationMode mode = MaterializationMode.Default, string schema = null, bool?cached = null, IConfiguration config = null) where TResult : class { Log.CaptureBegin(() => $"RetrieveImplemenation: {typeof(TResult).FullName}::{operation}"); IEnumerable <TResult> result; string queryKey = null; IdentityMap <TResult> identityMap = null; if (!cached.HasValue) { if (config == null) { config = ConfigurationFactory.Get <TResult>(); } cached = config.DefaultCacheRepresentation != CacheRepresentation.None; } if (cached.Value) { if (config == null) { config = ConfigurationFactory.Get <TResult>(); } queryKey = GetQueryKey <TResult>(operation, parameters ?? new Param[] { }, returnType); Log.CaptureBegin(() => $"Retrieving from L1 cache: {queryKey}"); if (returnType == OperationReturnType.MultiResult) { result = config.ExecutionContext.Get(queryKey) as IEnumerable <TResult>; } else { identityMap = Identity.Get <TResult>(); result = identityMap.GetIndex(queryKey); } Log.CaptureEnd(); if (result != null) { Log.Capture(() => $"Found in L1 cache: {queryKey}"); if (returnType == OperationReturnType.MultiResult) { ((IMultiResult)result).Reset(); } Log.CaptureEnd(); return(result); } Log.Capture(() => $"Not found in L1 cache: {queryKey}"); } result = await RetrieveItemsAsync(operation, parameters, operationType, returnType, connectionName, connection, types, map, cached.Value, mode, schema, config, identityMap); if (queryKey != null) { Log.CaptureBegin(() => $"Saving to L1 cache: {queryKey}"); if (!(result is IList <TResult>) && !(result is IMultiResult)) { if (config.DefaultCacheRepresentation == CacheRepresentation.List) { result = result.ToList(); } else { result = result.AsStream(); } } if (identityMap != null) { result = identityMap.AddIndex(queryKey, result); } else if (result is IMultiResult) { config.ExecutionContext.Set(queryKey, result); } Log.CaptureEnd(); } Log.CaptureEnd(); return(result); }