@forven

Как создать переменные и хранить их до определённого момента?

Выполняю поиск по базе данных по параметрам, которые задал пользователь. В результате получаются 2 массива с результатами поиска. Как их хранить и выдавать частями постранично ("пагинация"?) ?
Использование skip меня не устраивает, потому как поиск надо будет постоянно использовать, думаю что в моём кривом алгоритме это вызовет проблемы.
Я допускаю вариант создания объекта запроса, где будут храниться параметры запроса и 2 массива с результатами, а например при новом запросе он будет заменяться на новый, а при закрытии страницы поиска удаляться. Но как это реализовать я не знаю, и какие тут недостатки.
Какие ещё варианты есть выполнить поиск по базе единожды и хранить результаты до их ненадобности ?
  • Вопрос задан
  • 2713 просмотров
Решения вопроса 1
AlekseyNemiro
@AlekseyNemiro
full-stack developer
Обычно поиск выполняется один раз. Для повышения производительности, результаты поиска кэшируются и при последующих обращениях берутся из кэша. Кэш может храниться где угодно. Данные автоматически удаляются по истечению указанного срока жизни.

Как выдавать данные частями - зависит от того, как они получаются.

Разделение на страницы можно реализовать со стороны базы данных и получать данные только для конкретной страницы. Код не буду показывать, вариантов может быть множество. Решение будет зависеть от количества данных, ресурсоемкости запросов на поиск.

Что касается кэширования, то самый простой вариант:
// или HttpContext.Current.Cache
if (HttpContext.Cache["Ключ"] == null) 
{
  // данных в кэше нет, получаем из базы и добавляем в кэш
  HttpContext.Cache.Add
  (
    "Ключ",
    "тут сами данные",
    null,
    DateTime.Now.AddMinutes(5), // срок годности пять минут
    TimeSpan.Zero,
    System.Web.Caching.CacheItemPriority.Normal,
    null
  );
}
else
{
  // есть данные в кэше, используем их
  var data = HttpContext.Cache["Ключ"]; // типы строгие лучше использовать
}

Или использовать атрибут OutputCache и кэшировать страницы.

Дополнительно, можно в базе создавать сессии со ссылками на результаты поиска. Т.е. выполнять поиск, записывать ключ в таблицу, затем делать выборку, используя найденные ключи. Устаревшие результаты можно удалять, либо со стороны ASP.NET, периодически выполнять запрос. Либо, если есть возможность, настроить SQL Server Agent. Это если данных много и поиск дорого обходится.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@CrazyHorse
"Какие ещё варианты есть выполнить поиск по базе единожды и хранить результаты до их ненадобности ?" А что будете делать если между двумя запросами база изменится? покажите пользователю устаревшие данные? или например у Вас огромная база данных - вы собираетесь вытянуть ее всю а потом фильтровать по этому набору данных?
Я бы посмотрел в сторону пакета MvcPaging
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы