/// <summary> /// Retrieve multiple query results from the cache. /// </summary> /// <param name="queryCache">The cache.</param> /// <param name="keys">The query keys.</param> /// <param name="queryParameters">The array of query parameters matching <paramref name="keys"/>.</param> /// <param name="returnTypes">The array of query result row types matching <paramref name="keys"/>.</param> /// <param name="spaces">The array of query spaces matching <paramref name="keys"/>.</param> /// <param name="session">The session for which the queries are executed.</param> /// <param name="cancellationToken">A cancellation token that can be used to cancel the work</param> /// <returns>The cached query results, matching each key of <paramref name="keys"/> respectively. For each /// missed key, it will contain a <see langword="null" />.</returns> public static async Task <IList[]> GetManyAsync( this IQueryCache queryCache, QueryKey[] keys, QueryParameters[] queryParameters, ICacheAssembler[][] returnTypes, ISet <string>[] spaces, ISessionImplementor session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (queryCache is IBatchableQueryCache batchableQueryCache) { return(await(batchableQueryCache.GetManyAsync( keys, queryParameters, returnTypes, spaces, session, cancellationToken)).ConfigureAwait(false)); } var results = new IList[keys.Length]; for (var i = 0; i < keys.Length; i++) { results[i] = await(queryCache.GetAsync(keys[i], queryParameters[i], returnTypes[i], spaces[i], session, cancellationToken)).ConfigureAwait(false); } return(results); }
/// <summary> /// Get query results from the cache. /// </summary> /// <param name="queryCache">The cache.</param> /// <param name="key">The query key.</param> /// <param name="queryParameters">The query parameters.</param> /// <param name="returnTypes">The query result row types.</param> /// <param name="spaces">The query spaces.</param> /// <param name="session">The session for which the query is executed.</param> /// <param name="cancellationToken">A cancellation token that can be used to cancel the work</param> /// <returns>The query results, if cached.</returns> public static async Task <IList> GetAsync( this IQueryCache queryCache, QueryKey key, QueryParameters queryParameters, ICacheAssembler[] returnTypes, ISet <string> spaces, ISessionImplementor session, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (queryCache is IBatchableQueryCache batchableQueryCache) { return(await(batchableQueryCache.GetAsync( key, queryParameters, returnTypes, spaces, session, cancellationToken)).ConfigureAwait(false)); } if (!_hasWarnForObsoleteQueryCache) { _hasWarnForObsoleteQueryCache = true; Log.Warn("{0} is obsolete, it should implement {1}", queryCache, nameof(IBatchableQueryCache)); } var persistenceContext = session.PersistenceContext; var defaultReadOnlyOrig = persistenceContext.DefaultReadOnly; if (queryParameters.IsReadOnlyInitialized) { persistenceContext.DefaultReadOnly = queryParameters.ReadOnly; } else { queryParameters.ReadOnly = persistenceContext.DefaultReadOnly; } try { #pragma warning disable 618 return(await(queryCache.GetAsync( #pragma warning restore 618 key, returnTypes, queryParameters.NaturalKeyLookup, spaces, session, cancellationToken)).ConfigureAwait(false)); } finally { persistenceContext.DefaultReadOnly = defaultReadOnlyOrig; } }
public async Task <IList> GetResultFromQueryCacheAsync(ISessionImplementor session, QueryParameters queryParameters, ISet <string> querySpaces, IQueryCache queryCache, QueryKey key, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); if (!queryParameters.ForceCacheRefresh) { IList list = await(queryCache.GetAsync(key, new ICacheAssembler[] { this }, queryParameters.NaturalKeyLookup, querySpaces, session, cancellationToken)).ConfigureAwait(false); //we had to wrap the query results in another list in order to save all //the queries in the same bucket, now we need to do it the other way around. if (list != null) { list = (IList)list[0]; } return(list); } return(null); }