2017-05-18 2 views
0

Benötigen Sie Hilfe hier. Der DotNet-Core versucht, JSON-Array des Objekts von Redis mithilfe von IDistributedCache zu speichern und abzurufen. Unten ist mein Code zum Speichern und von Redis Cache Lesendotnet core Speichern von Objekten in 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); 
    } 

das Objekt, das ich speichern will, ist

In meiner biz Logik, wie diese das Objekt speicherten

public IQueryable<RuleLoadCollection_Result> GetRuleLibrary() 
    { 
     var result = _dbClient.GetRuleLibrary(); 
     _cache.Save("TestKey", result); 
     return result; 
    } 

die Ausgabe hier ist ein Array von Objekt.

[{"ruleId":1,"ruleName":"a1"}] 

Welchen Code soll ich schreiben, um das gleiche Array von Objekten aus dem Cache zurückzugeben? Ich habe einige Optionen ausprobiert, die meisten gaben Kompilierungs- oder Laufzeitfehler. Nach dem bisschen Surfen, habe ich versucht, es funktioniert, aber es gibt nur das erste Element des Arrays.

public RuleLoadCollection_Result GetRuleLibraryFromCache() 
    { 
     return (_cache.Get<List<RuleLoadCollection_Result>>("TestKey").First()); 
    } 

Ausgang hierfür ist

{"ruleId":1,"ruleName":"a1"} 

, die ich verstehen, warum, aber was C# sollte ich schreiben zurück zu JSON-Array, das ich gespeichert?

unten Code gibt dem Laufzeitfehler

public IQueryable<RuleLoadCollection_Result> GetRuleLibraryFromCache() 
    { 
     return (_cache.Get<IQueryable<RuleLoadCollection_Result>>("TestKey")); 
    } 

der Laufzeitfehler ist

"Cannot create and populate list type System.Linq.IQueryable`1[RuleLoadCollection_Result]. Path '', line 1, position 1." 

bitte helfen.

danke.

Antwort

0

Das funktionierte.

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