2012-03-19 103 views
0

我正在查看一个问题,我希望从昂贵的服务调用中获取一个集合,然后将其存储在缓存中,以便它可以用于用户界面上的后续操作。我正在使用的代码如下:MemoryCache意外覆盖

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就足够了),您需要复制该列表。

而不是修改列表考虑使用LINQ操作,如Where/Select。

+0

感谢就像一个魅力:)! – user1133512 2012-03-19 05:26:50

0

我要么:

  • 动态应用过滤器,如果需要更换过滤器(所以你缓存完整的数据,但只返回cachedData Where(currentFilter)
  • 使两个缓存 - 一个完整的资料。和一个用于过滤的数据 - 在这种情况下,第一个应该只包含数据从服务返回 - 无需缓存VO - 数据以及