Вам просто нужно проверить, не является ли значение, полученное из вашего источника данных, нулевым, прежде чем пытаться добавить его обратно в кэш, см. Ниже:
Info info = null;
if (HttpRuntime.Cache["Info_" + id.ToString() + "_" + quantity.ToString()] != null)
info = HttpRuntime.Cache["Info_" + id.ToString() + "_" + quantity.ToString()] as Info;
if (info == null)
{
info = (from dd in dc.Infos
where dd.id == id && dd.active == true && dd.quantitytooffset == quantity
select dd).SingleOrDefault();
if (info != null)
{
HttpRuntime.Cache.Add("Info_" + id.ToString() + "_" + quantity.ToString(), info, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.High, null);
}
}
Поскольку вы используете преобразование as Info
в начале вашего кода, если ключ отсутствует в кэше, он все равно вернет значение null
, поэтому вам не нужно сохранять значение null
в кэше.Хранение null
значений в кэше на самом деле бесполезно, поэтому есть причина, по которой среда не позволяет вам этого делать.
Также в качестве небольшого дополнения было бы неплохо создатьваш ключ кеша один раз, затем повторно используйте его, а не восстанавливайте каждый раз, когда он используется.Например:
var key = string.Format("Info_{0}_{1}", id, quantity);
Тогда просто используйте:
HttpRuntime.Cache[key]
При доступе к нему ваш код будет менее подвержен ошибкам при опечатке.