我正在使用LinqToSql查詢來從數據庫中選擇一個組列表,並噴出一個表。我編寫了一個自定義類來緩存此查詢的結果以獲得更好的性能。麻煩的是,每當我實現緩存類時,我都會從輸出語句中獲得奇怪的附加行爲。ASP.NET MVC 3/Razor - 奇怪的緩存問題
我的結果列于格式
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>;
}
}
UPDATE:
我現在已經實現的亞當Tuliper,並呼籲與using
條款的數據上下文的保廷的建議,結束了LINQ語句ToList()
和使用ICollection
而不是IQueryable
。問題仍在發生。
另一個有趣的觀察:只有當我導航到另一頁並返回時,問題纔會發生。如果我只是刷新頁面,它不會發生(儘管以前的任何數量的增加仍然當我刷新)
感謝,我會嘗試 – roryok 2012-02-20 16:27:13
我會甚至遠遠地使用'ICollection'作爲API。這可能是「IEnumerable」和「IQueryable」最大的誤解之一:它們代表**未執行的查詢**,而不是結果,緩存查詢不好,通過使用'.ToList()'緩存結果' – 2012-02-20 17:15:56
好的,我已經完成了上述所有工作,問題仍然存在。 datacontext現在使用using子句調用,我使用ICollection而不是IQueryable,並且在語句結尾還使用了ToList()。 – roryok 2012-02-27 11:37:40