MemoryCache неожиданно перезаписан - PullRequest
0 голосов
/ 19 марта 2012

Я смотрю на проблему, когда я хочу получить коллекцию из дорогостоящего вызова службы, а затем сохранить ее в кэше, чтобы ее можно было использовать для последующих операций в пользовательском интерфейсе.Я использую следующий код:

 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 влияет на кэшированную версию.т.е. я хочу, чтобы кэшированная версия всегда отражала полный набор данных, возвращаемый вызовом службы.Затем я хочу извлекать эту коллекцию из кэша всякий раз, когда фильтр установлен, и применять его, но это не должно изменять кэшированные данные - т.е. последующие фильтры должны выполняться в полном наборе данных - каков наилучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Вам необходимо сделать копию списка, если вы хотите использовать операцию RemoveAll (достаточно ToList).

Также вместо изменения списка рассмотрите возможность использования операций LINQ, таких как Where / Select.

0 голосов
/ 19 марта 2012

Я бы либо:

  • применил фильтр динамически и заменил фильтр при необходимости (поэтому вы кешируете полные данные, но возвращаете только cachedData. Where(currentFilter)
  • сделать двакэши - один для полных данных и один для отфильтрованных данных - в этом случае первый должен состоять только из данных, возвращаемых из службы - нет необходимости также кэшировать VO -данные *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...