2012-02-20 85 views
2

我正在使用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。問題仍在發生。

另一個有趣的觀察:只有當我導航到另一頁並返回時,問題纔會發生。如果我只是刷新頁面,它不會發生(儘管以前的任何數量的增加仍然當我刷新)

回答

2

,而不是返回IQueryable的,儘量使用簡單的IEnumerable和同樣使用

 
using(DBContext db = new DBContext()) 
{ 
var Groups = 
       (from g in db.Groups 
       where g.user_id == user_id 
       select g).ToList(); 
... 
} 

而且處置你在上面的語句上下文(與使用條款)

的ToList()強制執行「現在」 - 我想你可能已經推遲執行力的問題

+0

感謝,我會嘗試 – roryok 2012-02-20 16:27:13

+0

我會甚至遠遠地使用'ICollection'作爲API。這可能是「IEnumerable」和「IQueryable」最大的誤解之一:它們代表**未執行的查詢**,而不是結果,緩存查詢不好,通過使用'.ToList()'緩存結果' – 2012-02-20 17:15:56

+0

好的,我已經完成了上述所有工作,問題仍然存在。 datacontext現在使用using子句調用,我使用ICollection而不是IQueryable,並且在語句結尾還使用了ToList()。 – roryok 2012-02-27 11:37:40