Я бы порекомендовал вам использовать объект Cache вместо Session.Помните, что сеанс привязан к конкретному пользователю.Поэтому, если другой пользователь заходит на ваш сайт, он также попадет в базу данных.Объект Cache является общим для всех пользователей.Таким образом, действие вашего контроллера может выглядеть примерно так:
public ActionResult Foo(string q)
{
var data = HttpContext.Cache[q];
if (data == null)
{
data = FetchFromDb(q);
HttpContext.Cache[q] = data;
}
return Json(data, JsonRequestBehavior.AllowGet);
}