需要一些帮助。使用DotNet核心尝试使用IDistributedCache从Redis保存和检索对象的JSON数组。下面是我从Redis缓存中存储和读取的代码
public void Save(string key, object content, int duration)
{
string s;
if (content is string)
{
s = (string)content;
}
else
{
s = JsonConvert.SerializeObject(content);
}
duration = duration <= 0 ? DefaultCacheDuration : duration;
Cache.Set(key, Encoding.UTF8.GetBytes(s), new DistributedCacheEntryOptions()
{
AbsoluteExpiration = DateTime.Now + TimeSpan.FromSeconds(duration)
});
}
public T Get<T>(string key) where T : class
{
var c = Cache.Get(key);
if (c == null)
{
return null;
}
var str = Encoding.UTF8.GetString(c);
if (typeof(T) == typeof(string))
{
return str as T;
}
return JsonConvert.DeserializeObject<T>(str);
}
我要存储的对象是
public class RuleLoadCollection_Result
{
[Key]
public int RuleId { get; set; }
public string RuleName { get; set; }
}
在我的商业逻辑中,我正在保存像这样的对象
public IQueryable<RuleLoadCollection_Result> GetRuleLibrary()
{
var result = _dbClient.GetRuleLibrary();
_cache.Save("TestKey", result);
return result;
}
这里的输出是一个Object数组。
[{"ruleId":1,"ruleName":"a1"}]
我应该编写什么代码来从缓存中返回相同的对象数组?我尝试了几个选项,其中大多数都给出了编译或运行时错误。经过一段时间的浏览后,我尝试了下面,它工作,但它只给出数组的第一个元素。
public RuleLoadCollection_Result GetRuleLibraryFromCache()
{
return (_cache.Get<List<RuleLoadCollection_Result>>("TestKey").First());
}
的输出是
{"ruleId":1,"ruleName":"a1"}
我理解为什么,但是我应该把C#写入我保存的JSON数组?
下面的代码给出了运行时错误
public IQueryable<RuleLoadCollection_Result> GetRuleLibraryFromCache()
{
return (_cache.Get<IQueryable<RuleLoadCollection_Result>>("TestKey"));
}
运行时错误是
"Cannot create and populate list type System.Linq.IQueryable`1[RuleLoadCollection_Result]. Path '', line 1, position 1."
请帮忙。
感谢。
答案 0 :(得分:0)
这很有用。
public IQueryable<RuleLoadCollection_Result> GetRuleLibraryFromCache()
{
var result = _cache.Get<IEnumerable<RuleLoadCollection_Result>>("TestKey").AsQueryable();
return result;
}