2012-03-19 102 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 - 數據以及