Ho un servizio di cache come questo:L'accesso a MemoryCache crea una copia?
public interface ICacheService {
T Get<T>(string cacheID, Func<T> getItemCallback, int cacheMinutes = 5) where T : class;
}
public class MemoryCacheService : ICacheService {
public T Get<T>(string cacheId, Func<T> getItemCallback, int cacheMinutes = 5) where T : class {
T item = MemoryCache.Default.Get(cacheId) as T;
if (item == null) {
item = getItemCallback();
MemoryCache.Default.Add(cacheId, item,
new CacheItemPolicy {AbsoluteExpiration = DateTime.Now.AddMinutes(cacheMinutes)});
}
return item;
}
}
e recuperati in questo modo:
var result = _cache.Get("mylist",() => _database.Fetch<MyList>().AsQueryable(), 600);
La lista è grande e vi si accede frequentemente in un menu a discesa per ogni sequenza di tasti di immissione facilitata. E la condizione di query è anche dinamica, come
if (this) result = result.Where(x=> this ...)
if (that) result = result.Where(x=> that ...)
finally result.ToList()
Mi chiedo, ogni volta che accedere alla lista dalla cache, fa il sistema crea una copia dei dati prima di query LINQ edificio di inizio? Se è così, è come la copia per tastiera, non molto efficiente. O lo ha differito la query perché sto recuperando AsQueryable e costruisci linq?
Qualche alternativa migliore? Grazie
Ho provato quanto segue per testare quello che hai detto. 'List1 = _cache.Get (...); list1 = list1.Take (2) .ToList(); list2 = _cache.Get (...); 'L'elenco non dovrebbe essere troncato a 2 se fanno riferimento allo stesso oggetto? Ma sembra che abbia ancora l'elenco completo ogni volta. – Whoever
No, perché stai creando una nuova istanza di elenco. Prova a richiamare "Rimuovi" sul riferimento che ottieni dalla cache. –
Ha fatto qualche prova. Sembra che qualsiasi operazione che restituisce una lista crea una copia e modifica il riferimento alla lista1 da quel momento in poi. Non sono sicuro di cosa sia successo a IQueryable ad ogni raffinamento, ma dal momento che non si è materializzato fino alla ToList finale, indovina sto bene. Grazie a tutti i dettagli. – Whoever