Ejemplo n.º 1
0
        private static async Task <IEnumerable <T> > RetrieveItemsAsync <T>(string operation, IList <Param> parameters, OperationType operationType, OperationReturnType returnType, string connectionName, DbConnection connection, IList <Type> types, Func <object[], T> map, bool cached, MaterializationMode mode, string schema, IConfiguration config, IdentityMap <T> identityMap)
            where T : class
        {
            if (operationType == OperationType.Guess)
            {
                operationType = operation.Any(char.IsWhiteSpace) ? OperationType.Sql : OperationType.StoredProcedure;
            }

            var operationText = GetOperationText(typeof(T), operation, operationType, schema, config);

            var response = connection != null
                ? await ExecuteAsync(operationText, parameters, returnType, connection : connection, operationType : operationType, types : types, schema : schema)
                : await ExecuteAsync(operationText, parameters, returnType, connectionName : connectionName, operationType : operationType, types : types, schema : schema);

            var result = Translate(response, map, types, cached, mode, identityMap);

            return(result);
        }
Ejemplo n.º 2
0
        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);
        }