2009-10-08 92 views
0

ASP.NET是否支持使用內置緩存的多個緩存的概念?我的最終目標是能夠從緩存中提取某種類型的所有項目。這可以通過每種類型的單獨緩存或通過某種命名約定來完成。理想情況下,我可以通過以下方式使用LINQ:ASP.NET獨立緩存?

var items =(from item in cache.Items where item.Key.StartsWith(「person」)select item);

或者我可以定義一個單獨的「人」緩存。這是可能的內置系統或我需要使用第三方替代?

感謝

回答

3

事實上,Cache類已經implementsIEnumerable,這樣你就可以foreach在它(與LINQ查詢它,對於這個問題)。文檔沒有說明這個枚舉器產生什麼類型的對象,但是這可以在調試器中一次又一次找到。

+0

我意識到它支持IEnumerable,但我認爲它只是返回值的無類型對象。實際上,它返回一個具有鍵和值的DictionaryEntry對象的枚舉。所以我現在可以這樣做: var people =(from entry entry in cache where entry.Key.StartsWith(「person」)select entry.Value); – 2009-10-08 15:02:36

1
public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Cache.Insert("nord", new Person("Nord")); 
     Cache.Insert("bert", new Person("Bert")); 
     Cache.Insert("frog", new Animal("Kermit")); 

     foreach (Person p in Cache.CacheOfType<Person>()) 
     { 
      Response.Write(p.Name); //prints NordBert 
     } 
     Response.Write("<br>"); 
     foreach (Animal a in Cache.CacheOfType<Animal>()) 
     { 
      Response.Write(a.Name); //prints Kermit 
     } 
    } 
} 

public static class CacheExt 
{ 
    public static IEnumerable<T> CacheOfType<T>(this System.Web.Caching.Cache cache) where T : class 
    { 
     foreach (System.Collections.DictionaryEntry i in cache) 
     { 
      if (i.Value as T != null) yield return (T)i.Value; 
     } 
    } 
} 
+0

緩存實際上並沒有Items集合。即使這樣做,這也無濟於事,因爲它只會返回DictionaryEntry的類型。 – 2009-10-08 15:48:13