J'utilise une requête LinqToSql pour sélectionner une liste de groupes dans une base de données et produire un tableau. J'ai écrit une classe personnalisée pour mettre en cache les résultats de cette requête afin d'améliorer les performances. Le problème est qu'à chaque fois que j'implémente la classe de mise en cache, j'obtiens un comportement d'ajout bizarre de la part de l'instruction de sortie.
Mes résultats sont affichés dans le format
Test Group (1)
où "Test Group" est le nom, et (1) est le nombre de membres dans ce groupe. Voici le code qui ajoute le nombre au nom (à partir de la vue)
<td>@group.group_name (@group.num_total)</td>
Lorsque je tire cela d'une requête linq en direct qui renvoie des groupes, tout fonctionne comme prévu.
Cependant Lorsque j'utilise ma classe de mise en cache, chaque chargement de page successif ajoute le numéro à la fin du titre du groupe :
Test Group (1) (1) (1) (1) (1) (1)
Cela ne se produit que lorsque j'utilise la classe de cache (incluse ci-dessous). J'ai examiné la classe de cache et je ne vois pas pourquoi cela se produirait.
Je peux penser à plusieurs solutions de contournement pour ce problème, donc ce n'est pas un obstacle, mais je suis curieux de savoir ce qui se passe. Une idée ?
Classe de mise en cache :
public class Cache
{
public static int user_id {
get { return
Convert.ToInt32(
Membership.GetUser(
HttpContext.Current.User.Identity.Name
).ProviderUserKey
);
}
}
public static void GetGroups_InvalidateCache()
{
if (HttpContext.Current.Cache["GetGroups_" + user_id] != null)
HttpContext.Current.Cache.Remove("GetGroups_" + user_id);
}
public static ICollection<Groups> GetGroups()
{
if (HttpContext.Current.Cache["GetGroups_" + user_id] == null)
{
using(DBContext db = new DBContext())
{
var Groups = (from g in db.Groups
where g.user_id == user_id
select g).ToList();
HttpContext.Current.Cache.Insert(
"GetGroups_" + user_id,
Groups,
null,
DateTime.Now.AddMinutes(5),
TimeSpan.Zero
);
}
}
return HttpContext.Current.Cache["GetGroups_" + user_id]
as ICollection<Groups>;
}
}
UPDATE :
J'ai maintenant implémenté les suggestions d'Adam Tuliper et de Paul Tyng d'appeler le contexte de données avec la fonction using
en terminant l'instruction linq par ToList()
et en utilisant ICollection
au lieu de IQueryable
. Le problème se pose toujours.
Une autre observation intéressante : Le problème ne se produit que si je navigue vers une autre page et que je reviens. Si je rafraîchis simplement la page, cela ne se produit pas (bien que les ajouts de chiffres précédents soient toujours présents lorsque je rafraîchis la page).