在HttpContext.Current.Items缓存中使用lambda表达式查找键
本文关键字:lambda 表达式 查找 HttpContext Current Items 缓存 | 更新日期: 2023-09-27 18:21:54
我有一个按请求缓存,使用HttpContext.Current.Items实现,如下所示:
private static readonly Lazy<CacheCurrentCall> lazy =
new Lazy<CacheCurrentCall>(() => new CacheCurrentCall());
public static CacheCurrentCall Instance
{
get
{
IDictionary items = HttpContext.Current.Items;
if (!items.Contains("CacheCurrentCall"))
{
items["CacheCurrentCall"] = new CacheCurrentCall();
}
return items["CacheCurrentCall"] as CacheCurrentCall;
}
}
private CacheCurrentCall()
{
}
public void Add<T>(T o, string key, int cacheDurationSeconds = 0)
{
HttpContext.Current.Items.Add(key, o);
}
public void Clear(string key)
{
HttpContext.Current.Items.Remove(key);
}
public bool Exists(string key)
{
return HttpContext.Current.Items[key] != null;
}
public bool Get<T>(string key, out T value)
{
try
{
if (!Exists(key))
{
value = default(T);
return false;
}
value = (T)HttpContext.Current.Items[key];
}
catch
{
value = default(T);
return false;
}
return true;
}
现在我需要删除所有以特定字符串开头的键,因此我想到了一种类似的方法
public IEnumerable<string> GetKey (Func<string, bool> condition)
然后循环遍历结果并清除它们(我想我甚至可以在clear aceting中直接清除lambda表达式)。但是,如果真的有可能的话,我在尝试实现这样一个方法时迷失了方向。
有什么帮助吗?
感谢
编辑:
Servy,我在尝试(一直在盲目地尝试一些事情,但或多或少地遵循这条道路)
public IEnumerable<string> GetKeys(Func<string, bool> condition)
{
List<string> list = new List<string>();
foreach (var key in HttpContext.Current.Items.Keys)
{
if (condition(key as string))
{
list.Add(key as string);
}
}
return list;
}
但我得到了:
对象引用未设置为对象的实例
我现在要试着说,除了它可能有效之外,它在我看来要优雅得多。
第二次编辑:
我需要稍微改变p.s.w.g的解决方案。我不在缓存中存储字符串,而是存储其他类型的对象,所以我现在使用这个
public IEnumerable<string> GetKeys (Func<string, bool> condition)
{
return HttpContext.Current.Items
.Cast<DictionaryEntry>()
.Where(e => e.Key is string && condition(e.Key as string))
.Select(e => e.Key as string);
}
例如,一个清除缓存的调用就是这个
public void ClearCache()
{
var ownedItemSummaryKeys = CacheCurrentCall.Instance.GetKeys(k => k.Contains("OwnedItemSummaryCurrent"));
foreach (var ownedItemSummaryKey in ownedItemSummaryKeys.ToList())
{
CacheCurrentCall.Instance.Clear(ownedItemSummaryKey);
}
}
Items
属性是IDictionary
,因此必须执行以下操作:
public IEnumerable<string> GetKey (Func<string, bool> condition)
{
return HttpContext.Current.Items
.Cast<DictionaryEntry>()
.Where(e => e.Key is string &&
e.Value is string &&
condition(e.Key as string))
.Select(e => e.Value as string);
}
或在查询语法中:
public IEnumerable<string> GetKey (Func<string, bool> condition)
{
return
from e in HttpContext.Current.Items.Cast<DictionaryEntry>()
where e.Key is string &&
e.Value is string &&
condition(e.Key as string)
select e.Value as string;
}
更新我错过了阅读问题。我认为您希望根据键的某些标准来选择值。如果你只想选择键,实际上会简单一点:
public IEnumerable<string> GetKey (Func<string, bool> condition)
{
return HttpContext.Current.Items.Keys
.OfType<string>()
.Where(condition);
}
或者在查询语法中:
public IEnumerable<string> GetKey (Func<string, bool> condition)
{
return
from k in HttpContext.Current.Items.Keys.OfType<string>()
where condition(k)
select k;
}