私は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を返す
感謝を持っていると思う、私は – roryok
私がすることをみますまでも行くAPIに 'ICollection'を使用します。これはおそらく 'IEnumerable'と' IQueryable'の最大の誤解の1つです:それらは**実行されていないクエリ**を表し、結果はキャッシュしません、あなたは良い結果をキャッシュしません、 '.ToList() 'を使って結果をキャッシュします –
オクラホマ、私は上記のすべてをやっているし、問題はまだそこにある。 datacontextがusing句で呼び出され、IQueryableの代わりにICollectionが使用されています。また、ToList()も文の最後に使用しています。 – roryok