Обычно поиск выполняется один раз. Для повышения производительности, результаты поиска кэшируются и при последующих обращениях берутся из кэша. Кэш может храниться где угодно. Данные автоматически удаляются по истечению указанного срока жизни.
Как выдавать данные частями - зависит от того, как они получаются.
Разделение на страницы можно реализовать со стороны базы данных и получать данные только для конкретной страницы. Код не буду показывать, вариантов может быть множество. Решение будет зависеть от количества данных, ресурсоемкости запросов на поиск.
Что касается кэширования, то самый простой вариант:
// или 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. Это если данных много и поиск дорого обходится.