public IList Get(QueryKey key, ICacheAssembler[] returnTypes, bool isNaturalKeyLookup, ISet <string> spaces, ISessionImplementor session) { if (log.IsDebugEnabled) { log.DebugFormat("checking cached query results in region: '{0}'; {1}", regionName, key); } var cacheable = (IList)queryCache.Get(key); if (cacheable == null) { log.DebugFormat("query results were not found in cache: {0}", key); return(null); } var timestamp = (long)cacheable[0]; if (log.IsDebugEnabled) { log.DebugFormat("Checking query spaces for up-to-dateness [{0}]", StringHelper.CollectionToString((ICollection)spaces)); } if (!isNaturalKeyLookup && !IsUpToDate(spaces, timestamp)) { log.DebugFormat("cached query results were not up to date for: {0}", key); return(null); } log.DebugFormat("returning cached query results for: {0}", key); for (int i = 1; i < cacheable.Count; i++) { if (returnTypes.Length == 1) { returnTypes[0].BeforeAssemble(cacheable[i], session); } else { TypeFactory.BeforeAssemble((object[])cacheable[i], returnTypes, session); } } IList result = new List <object>(cacheable.Count - 1); for (int i = 1; i < cacheable.Count; i++) { try { if (returnTypes.Length == 1) { result.Add(returnTypes[0].Assemble(cacheable[i], session, null)); } else { result.Add(TypeFactory.Assemble((object[])cacheable[i], returnTypes, session, null)); } } catch (UnresolvableObjectException) { if (isNaturalKeyLookup) { //TODO: not really completely correct, since // the UnresolvableObjectException could occur while resolving // associations, leaving the PC in an inconsistent state log.Debug("could not reassemble cached result set"); queryCache.Remove(key); return(null); } throw; } } return(result); }