2017-05-18 14 views
0

도움이 필요합니다. DotNet 코어를 사용하여 IDistributedCache를 사용하여 Redis에서 개체의 JSON Array를 저장하고 검색하려고합니다. 다음은 저장 및 레디 스 캐시에서 읽어 내 코드는dotnet core 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 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()); 
    } 

출력은,하지만 난 JSON 배열에 기록해야하는지 C# 다시 내가 저장 한 이유를 이해

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

입니까? 코드 아래

런타임 오류가 도와주세요

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

입니다

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

런타임 오류를 제공합니다.

감사합니다.

답변

0

이것은 효과가 있습니다.

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