dotnet core在RedIs中存储对象

时间:2017-05-18 06:16:00

标签: c# json redis deserialization core

需要一些帮助。使用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."

请帮忙。

感谢。

1 个答案:

答案 0 :(得分:0)

这很有用。

public IQueryable<RuleLoadCollection_Result> GetRuleLibraryFromCache()
    {
        var result = _cache.Get<IEnumerable<RuleLoadCollection_Result>>("TestKey").AsQueryable();
        return result;
    }