2012-02-20 13 views
2

私はLinqToSqlクエリを使用してデータベースからグループのリストを選択し、テーブルを吐き出します。私はパフォーマンスを向上させるために、このクエリの結果をキャッシュするカスタムクラスを作成しました。問題は、私がキャッシングクラスを実装するたびに、出力文から奇妙な追加動作が発生することです。ASP.NET MVC 3/Razor - 奇妙なキャッシングの問題

私の結果は「試験群」が名前であり、(1)そのグループ内のメンバの数であるフォーマット

Test Group (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:

私は今ToList()でLINQ文を終了し、using句でデータコンテキストを呼び出すのアダムTuliperとポールTyngの提案を実装しましたし、 IQueryableの代わりにICollectionを使用してください。問題はまだ発生しています。

もう1つ興味深い観察:別のページに移動して戻ると問題が発生します。私は単純にページを更新する場合は代わりのIQueryableを返す

答えて

2

を(以前の数の追加はまだ私はリフレッシュしたときに残っているが)、それは発生しません、単にIEnumerableを使用してもの処分も

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

を使用してみてください(using句を持つ)上記の文のように、あなたのコンテキスト

ToListメソッド()は、「今」の実行を強制的に - 私はあなたが潜在的に遅延実行の問題に

+0

感謝を持っていると思う、私は – roryok

+0

私がすることをみますまでも行くAPIに 'ICollection'を使用します。これはおそらく 'IEnumerable'と' IQueryable'の最大の誤解の1つです:それらは**実行されていないクエリ**を表し、結果はキャッシュしません、あなたは良い結果をキャッシュしません、 '.ToList() 'を使って結果をキャッシュします –

+0

オクラホマ、私は上記のすべてをやっているし、問題はまだそこにある。 datacontextがusing句で呼び出され、IQueryableの代わりにICollectionが使用されています。また、ToList()も文の最後に使用しています。 – roryok