public T ProcessExecutingCommands <T>(DbCommand command, DbContext context, T result)
        {
            if (command is null)
            {
                throw new ArgumentNullException(nameof(command));
            }

            var cachePolicy = _cachePolicyManager.GetCachePolicy(command.CommandText);

            if (cachePolicy is null)
            {
                return(result);
            }

            var cacheKey = CacheKeyProvider.GetKey(command, context, cachePolicy);

            var cacheResult = _cacheProvider.Get <CachedData>(cacheKey.ToString());

            if (cacheResult.IsNull)
            {
                return(result);
            }

            if (result is InterceptionResult <DbDataReader> )
            {
                if (cacheResult.IsNull)
                {
                    using var rows = new DataReader(new TableRows());
                    return((T)Convert.ChangeType(
                               InterceptionResult <DbDataReader> .SuppressWithResult(rows),
                               typeof(T),
                               CultureInfo.InvariantCulture));
                }

                using var dataRows = new DataReader(cacheResult.Value.TableRows);
                return((T)Convert.ChangeType(
                           InterceptionResult <DbDataReader> .SuppressWithResult(dataRows),
                           typeof(T),
                           CultureInfo.InvariantCulture));
            }

            return(result);
        }
        public T ProcessExecutedCommands <T>(DbCommand command, DbContext context, T result)
        {
            if (command is null)
            {
                throw new ArgumentNullException(nameof(command));
            }

            if (result is DataReader)
            {
                return(result);
            }

            var commandText = command.CommandText;
            var cachePolicy = _cachePolicyManager.GetCachePolicy(commandText);

            if (cachePolicy is null)
            {
                return(result);
            }

            var cacheKey = CacheKeyProvider.GetKey(command, context, cachePolicy);

            if (result is DbDataReader dataReader)
            {
                TableRows tableRows;
                using (var dbReaderLoader = new DataReaderLoader(dataReader))
                {
                    tableRows = dbReaderLoader.LoadAndClose();
                }

                _cacheProvider.Set(cacheKey.ToString(), new CachedData {
                    TableRows = tableRows
                },
                                   cachePolicy.CacheTimeout);

                return((T)(object)new DataReader(tableRows));
            }

            return(result);
        }