I want to store null for some of the keys in HttpRuntime.Cache
as I dont want to again go to Database to find that there is no entry for that key.
So first time, it goes to database and fills the cache. The intent is to serve the following calls using cached data instead of doing the database call.
Here is the code that I am using the following:
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();
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);
}
The last line of code i.e. HttpRuntime.Cache.Add throws an System.ArgumentNullException: Value cannot be null.
Any idea if this is possible or I need to use other datastructure to store null values and look up later?
You just need to check whether the value obtained from your data source is not null before trying to add it back to the cache, see below:
As you are using the
as Info
conversion at the beginning of your code, if the key isn't present in the cache it'll return anull
value anyway, so you don't need to store thenull
value in cache. Storingnull
values in the cache doesn't really serve any use, so there's a reason the framework is not allowing you to do that.Also as a slight side-note, it would be good to create your cache key once, then re-use it rather than reconstructing it every time it's used. For instance:
Then just use:
When accessing it, it'll make your code less prone to typo errors.
I wrote a blog post recently about how the
null
keyword is often abused leading to this kind of confusion. In your particular case I would look at using an option type to indicate the lack or presence of data rather than null.I have a simple implementation of an Option type you can use here
The usage would then be something like:
You could use your own "null" value to place into cache. For example,
Then you could use that instead of null in HttpRuntime.Cache.Add and later after retrieval from cache check that you didn't get your NULL_INFO