J'ai 2 requêtes similaires:Comment mettre en cache 'IQueryable <>. First' résultat?
ICmOption optionRes = CmOptionRepository<ICmOption>
.GetAll()
.Where(option => option.Name == strCommandName && option.Data == strCommandOption)
.FirstOrDefault()
;
IErrorType errorType = ErrorTypeRepository<IErrorType>
.GetAll()
.Where(et => et.ComponentId == (int)component.Id && et.ComponentErrorCode == strErrorCode)
.First()
;
Dans les deux cas, les données constantes de DB sont extraites. Pour cette raison, je veux mettre en cache les résultats de ces requêtes ...
la solution la plus simple pour une demande est:
public IErrorType GetErrorType(IComponent component, string strErrorCode)
{
IErrorType errorType;
string strKey = string.Concat(component.Id, "_", strErrorCode);
lock (Dict)
{
if (Dict.ContainsKey(strKey))
{
errorType = Dict[strKey];
}
else
{
errorType = Repository
.GetAll()
.Where(et => et.ComponentId == (int)component.Id && et.ComponentErrorCode == strErrorCode)
.First()
;
Dict.Add(strKey, errorType);
}
}
return errorType;
}
private static Dictionary<string, IErrorType> Dict { get { return _dict; } }
private static readonly Dictionary<string, IErrorType> _dict
= new Dictionary<string, IErrorType>();
je besoin de la même entité pour la 2e, et quelques autres sont à venir. .. Donc je veux créer une classe (CachableRepository) qui acceptera les paramètres, vérifier si l'objet pour eux est déjà mis en cache, sinon - obtenir des données de DB et mettre en cache. Le problème est: Je ne vois pas comment créer une clé pour le cache pour différents paramètres, et comment créer une fonction lambda pour ces paramètres. ...
Si vous avez des idées ou des suggestions, partagez-les.
Merci beaucoup!
Cela devrait faire, mais je voudrais éviter le blocage lors de la lecture du dictionnaire. Vous pouvez essayer de lire à partir du dictionnaire - si échoue, puis acquérir le verrou, puis essayez de relire. Une autre suggestion consiste à utiliser la méthode TryGet plutôt que ContainsKey. Actuellement, vous effectuez deux recherches dans le dictionnaire par lecture de cache. – VinayC
Eh bien, l'implémentation de TryGetValue fait un this.FindEntry (clé) d'abord, puis une valeur = this.entries [index] .value si trouvé, donc, fondamentalement, c'est aussi 2 consultations. – murki