我有一个linq查询,我将从Dictionary<int, string>
返回。我有一个重载的缓存方法,我创建了一个将Dictionary<T,T>
项作为参数之一。我在这个课程中有一些其他方法可以毫无问题地使用List<T>
和T[]
。但是这个方法拒绝使用线程主题的错误消息进行编译。
这是我的缓存类代码:
public static bool AddItemToCache<T>(string key, Dictionary<T, T> cacheItem, DateTime dt)
{
if (!IsCached(key))
{
System.Web.HttpRuntime.Cache.Insert(key, cacheItem, null, dt, TimeSpan.Zero);
return IsCached(key);
}
return true;
}
public static bool AddItemToCache<T>(string key, Dictionary<T, T> cacheItem, TimeSpan ts)
{
if (!IsCached(key))
{
System.Web.HttpRuntime.Cache.Insert(key, cacheItem, null, Cache.NoAbsoluteExpiration, ts);
return IsCached(key);
}
return true;
}
这是无法编译的linq查询:
private Dictionary<int, string> GetCriteriaOptions()
{
Dictionary<int, string> criteria = new Dictionary<int, string>();
string cacheItem = "NF_OutcomeCriteria";
if (DataCaching.IsCached(cacheItem))
{
criteria = (Dictionary<int, string>)DataCaching.GetItemFromCache(cacheItem);
}
else
{
Common config = new Common();
int cacheDays = int.Parse(config.GetItemFromConfig("CacheDays"));
using (var db = new NemoForceEntities())
{
criteria = (from c in db.OutcomeCriterias
where c.Visible
orderby c.SortOrder ascending
select new
{
c.OutcomeCriteriaID,
c.OutcomeCriteriaName
}).ToDictionary(c => c.OutcomeCriteriaID, c => c.OutcomeCriteriaName);
if ((criteria != null) && (criteria.Any()))
{
bool isCached = DataCaching.AddItemToCache(cacheItem, criteria, DateTime.Now.AddDays(cacheDays));
if (!isCached)
{
ApplicationErrorHandler.LogException(new ApplicationException("Unable to cache outcome criteria"),
"GetCriteriaOptions()", null, ErrorLevel.NonCritical);
}
}
}
}
return criteria;
}
这是行isCached = DataCaching .....我收到了错误。我已经尝试将其转换为字典(Dictionary<int, string>
),执行.ToDictionary()
,但没有任何效果。
有人有任何想法吗?
答案 0 :(得分:5)
这无法编译,因为字典的键和值类型必须相同,而您的字典不同。您可以将方法的定义更改为需要字符串键类型:
public static bool AddItemToCache<T>(string key, Dictionary<string, T> cacheItem, TimeSpan ts)
{
if (!IsCached(key))
{
System.Web.HttpRuntime.Cache.Insert(key, cacheItem, null, Cache.NoAbsoluteExpiration, ts);
return IsCached(key);
}
return true;
}
答案 1 :(得分:4)
从
更改方法签名中的参数Dictionary<T, T> cacheItem
到
Dictionary<TKey, TValue> cacheItem
T,T表示密钥和值具有相同的类型。