как сохранить список данных в памяти? - PullRequest
0 голосов
/ 26 августа 2018

У меня есть функция ajax, которая вызывается jquery-datatable, и у меня две обязанности.

  1. Для получения данных из базы данных.
  2. Для поиска, сортировки, нумерации страниц, как функциональная работа.

Теперь все, что мне нужно, - я просто хочу получить данные один раз и сохранить их в памяти, чтобы при вводе пользователем чего-либо в поле поиска он выполнял поиск непосредственно из сохраненных данных.

Вот код.

        public ActionResult AjaxOil(JQueryDataTableParamModel param)
    {
       //To get data and should be run only once.

        IEnumerable<Oil> allOils = _context.Oils.ToList();

       //All others function.
        IEnumerable<Oil> filteredOils;
        if (!string.IsNullOrEmpty(param.sSearch))
        {
            filteredOils = allOils
                     .Where(c => c.CommonName.Contains(param.sSearch)
                                 ||
                                 c.BotanicalName.Contains(param.sSearch)
                                 ||
                                 c.PlantParts.Contains(param.sSearch)
                                 ||
                                 c.Distillation.Contains(param.sSearch));
        }
        else
        {
            filteredOils = allOils;
        }

        var sortColumnIndex = Convert.ToInt32(Request["iSortCol_0"]);
        Func<Oil, string> orderingFunction = (c => sortColumnIndex == 1 ? c.CommonName :
                                                            sortColumnIndex == 2 ? c.BotanicalName :
                                                            c.PlantParts);


        var distillationFilter = Convert.ToString(Request["sSearch_4"]);
        var commonFilter = Convert.ToString(Request["sSearch_1"]);
        var botanicalFilter = Convert.ToString(Request["sSearch_2"]);
        var plantFilter = Convert.ToString(Request["sSearch_3"]);


        if (!string.IsNullOrEmpty(commonFilter))
        {
            filteredOils = filteredOils.Where(c => c.CommonName.Contains(commonFilter));

        }

        if (!string.IsNullOrEmpty(botanicalFilter))
        {
            filteredOils = filteredOils.Where(c => c.BotanicalName.Contains(botanicalFilter));

        }

        if (!string.IsNullOrEmpty(plantFilter))
        {
            filteredOils = filteredOils.Where(c => c.PlantParts.Contains(plantFilter));

        }

        if (!string.IsNullOrEmpty(distillationFilter))
        {
            filteredOils = filteredOils.Where(c => c.Distillation.Contains(distillationFilter));

        }


        var sortDirection = Request["sSortDir_0"];
        if (sortDirection == "asc")
            filteredOils = filteredOils.OrderBy(orderingFunction);
        else
            filteredOils = filteredOils.OrderByDescending(orderingFunction);

        var displayedOils = filteredOils
                           .Skip(param.iDisplayStart)
                           .Take(param.iDisplayLength);
        var result = from c in displayedOils
                     select new[] { Convert.ToString(c.OilId), c.CommonName, c.BotanicalName, c.PlantParts, c.Distillation };
        return Json(new
        {
            sEcho = param.sEcho,
            iTotalRecords = allOils.Count(),
            iTotalDisplayRecords = filteredOils.Count(),
            aaData = result
        },
                         JsonRequestBehavior.AllowGet);

1 Ответ

0 голосов
/ 26 августа 2018

При первой загрузке сохраните данные в кеш / сессию / статическое поле. При следующем поиске проверьте, не является ли кеш / сессия / статическое поле нулевым, и прочитайте оттуда, а не из db, иначе снова возьмите из db ..

Пример:

private static ObjectCache _cache = new MemoryCache("MemoryCache");
    public List<Oils> GetDataFromCache(string keyName)
    {
        //private static ObjectCache _cache = new MemoryCache("keyName");
        var data = _cache.Get(keyName); 
        if (data != null) return data as List<Oils>;

        data = _context.Oils.ToList();
        //keep the cache for 2h
        _cache.Add(keyName, data, DateTimeOffset.Now.AddHours(2));
        return data;
    } 

(не тестировал код, но это логика) или вы можете использовать Session, если предпочитаете

Пример сеанса:

if(Session["Data_Oils"] != null) { return Session["Data_Oils"] as List<Oils; } else { var temp = _context.Oils.ToList(); Session["Data_Oils"] = temp; return temp; } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...