2011-02-01 15 views
4

我需要清除緩存中包含密鑰中特定字符串的項目。我已經開始與以下,並認爲我可能能夠做一個linq查詢Linq Query IDictionaryEnumerator可能嗎?

var enumerator = HttpContext.Current.Cache.GetEnumerator(); 

但我不能?我希望能做些類似於

var enumerator = HttpContext.Current.Cache.GetEnumerator().Key.Contains("subcat"); 

有關我如何實現這一點的任何想法?

+5

撇開:枚舉整個緩存本來就是一個在繁忙的網站上的一個壞主意...... – 2011-02-01 11:54:22

+0

是的,我聽到你們所有......回到繪圖板 – leen3o 2011-02-01 12:33:36

回答

10

Cache創建的枚舉器生成DictionaryEntry對象。此外,Cache可能只有string密鑰。

因此,你可以寫:

var httpCache = HttpContext.Current.Cache; 
var toRemove = httpCache.Cast<DictionaryEntry>() 
    .Select(de=>(string)de.Key) 
    .Where(key=>key.Contains("subcat")) 
    .ToArray(); //use .ToArray() to avoid concurrent modification issues. 

foreach(var keyToRemove in toRemove) 
    httpCache.Remove(keyToRemove); 

然而,這是一個潛在的慢操作時,緩存大:在緩存中沒有這樣設計的使用。你應該問自己,一種替代設計是不可能的,更可取的。爲什麼你需要一次刪除多個緩存鍵,爲什麼不通過子串分組緩存鍵?

2

我不認爲這是遍歷整個緩存反正一個偉大的想法,但你可以用類似做非LINQ:

var iter = HttpContext.Current.Cache.GetEnumerator(); 
    using (iter as IDisposable) 
    { 
     while (iter.MoveNext()) 
     { 
      string s; 
      if ((s = iter.Key as string) != null && s.Contains("subcat")) 
      { 
       //... let the magic happen 
      } 
     } 
    } 

與LINQ做到這一點,你可以做是這樣的:

public static class Utils 
{ 
    public static IEnumerable<KeyValuePair<object, object>> ForLinq(this IDictionaryEnumerator iter) 
    { 
     using (iter as IDisposable) 
     { 
      while (iter.MoveNext()) yield return new KeyValuePair<object, object>(iter.Key, iter.Value); 
     } 
    } 
} 

和使用,如:

var items = HttpContext.Current.Cache.GetEnumerator().ForLinq() 
     .Where(pair => ((string)pair.Key).Contains("subcat")); 
+0

感謝上述,讚賞 - 但你會怎麼去清除緩存的項目,以某個鍵開始...? – leen3o 2011-02-01 12:09:11

+1

通過設計,使我不必...對不起,不是一個很好的答案恐怕 – 2011-02-01 12:19:52

5

由於Cache是​​一個IEnumerable,你可以自由地將所有需要的LINQ方法應用到它。你唯一需要的是將其轉換爲IEnumerable的<的DictionaryEntry >:

 

var keysQuery = HttpContext.Current.Cache 
    .Cast<DictionaryEntry>() 
    .Select(entry => (string)entry.Key) 
    .Where(key => key.Contains("subcat")); 
 

現在keysQuery是「SUBCAT」開始的所有鍵的非嚴格的集合。但是如果你需要從緩存中刪除這樣的條目,最簡單的方法就是使用foreach語句。