2012-03-19 13 views
0

私は高価なサービスコールからコレクションを取得し、それをキャッシュに保存してUIの後続の操作に使用できるようにするという問題を見ています。次のように私が使用しているコードは次のとおりです。予期せずメモリキャッシュが上書きされる

List<OrganisationVO> organisations = (List<OrganisationVO>)MemoryCache.Default["OrganisationVOs"]; 


     List<Organisation> orgs = new List<Organisation>(); 
     if (organisations == null) 
     { 
      organisations = new List<OrganisationVO>(); 
      orgs = pmService.GetOrganisationsByName("", 0, 4000, ref totalCount); 
      foreach (Organisation org in orgs) 
      { 
       OrganisationVO orgVO = new OrganisationVO(); 
       orgVO = Mapper.ToViewObject(org); 
       organisations.Add(orgVO); 
      } 

      MemoryCache.Default.AddOrGetExisting("OrganisationVOs", organisations, DateTime.Now.AddMinutes(10)); 
     } 

     List<OrganisationVO> data = new List<OrganisationVO>(); 
     data = organisations; 

     if (!string.IsNullOrEmpty(filter) && filter != "*") 
     { 
      data.RemoveAll(filterOrg => !filterOrg.DisplayName.ToLower().StartsWith(filter.ToLower())); 
     } 

私が直面してる問題はdata.RemoveAll操作がキャッシュされたバージョンに影響を与えることがあります。つまり、キャッシュされたバージョンにサービスコールによって返された完全なデータセットが常に反映されるようにします。フィルタを設定して適用するとキャッシュからこのコレクションを取得したいが、キャッシュされたデータは変更しないでください。つまり、後続のフィルタは完全なデータセットで実行する必要があります。

答えて

1

RemoveAll操作(ToListで十分です)を使用する場合は、リストのコピーを作成する必要があります。

また、リストを変更する代わりに、Where/SelectなどのLINQ操作を使用することを検討してください。

+0

おかげで魔法のように動作します:) – user1133512

0

私はどちらかになります。

  • ので、あなたが完全なデータをキャッシュするだけcachedDataを返す(動的フィルタを適用し、必要に応じてフィルターを交換Where(currentFilter)
  • は、2つのキャッシュ作る - 完全なデータのための1つを。そしてフィルタリングされたデータのための1 - この場合には最初のものはデータのみで構成されるべきサービスから返された - !VO -dataをキャッシュする必要はありませんだけでなく
関連する問題