Я использую запрос LinqToSql, чтобы выбрать список групп из базы данных и выпустить таблицу.Я написал собственный класс для кэширования результатов этого запроса для повышения производительности.Проблема в том, что всякий раз, когда я реализую класс кэширования, я получаю странное добавляющее поведение из оператора вывода.
Мои результаты выводятся в формате
Test Group (1)
, где «Группа тестов» - это имя, а (1) - количество членов в этой группе.Вот код, который добавляет количество к имени (из представления)
<td>@group.group_name (@group.num_total)</td>
Когда я извлекаю это из живого запроса linq, возвращающего группы, все работает как положено.
Однако , когда я использую свой класс кэширования, каждая последующая загрузка страницы добавляет число в конец заголовка группы:
Test Group (1) (1) (1) (1) (1) (1)
Это происходит только тогда, когдаЯ использую класс кеширования (включен ниже).Я изучил класс кеша и не вижу причин, по которым это происходит.
Я могу придумать несколько обходных путей для этой проблемы, так что это не пробка, но мне любопытно, чток тому, что происходит с выдумкой.Есть идеи?
Класс кэширования:
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>;
}
}
ОБНОВЛЕНИЕ:
Теперь я реализовал предложения Адама Тулипера и Пола Тинга о вызове контекста данных с помощьюusing
, заканчивая оператор linq ToList()
и используя ICollection
вместо IQueryable
.Проблема все еще происходит.
Еще одно интересное наблюдение: проблема возникает, только если я перехожу на другую страницу и возвращаюсь.Если я просто обновлю страницу, этого не произойдет (хотя при обновлении все равно остаются предыдущие добавления номера)