У меня есть тысячи пользователей в моем MVC APP, и я использую сортировку, поиск подкачки и поиск в моей таблице пользователей (by this tutorial), но для загрузки, сортировки или поиск.Кэширование списка в ASP.NET MVC 5
Так что у меня список пользователей
List<ApplicationUser> appUsers = _context.Users.ToList();
и у меня есть список моделей
List<RegisterViewModel> models = new List<RegisterViewModel>();
foreach (var au in appUsers)
{
RegisterViewModel rvm = new RegisterViewModel(au);
rvm.RoleName = UserManager.GetRoles(au.Id).First();
models.Add(rvm); //new RegisterViewModel(au));
}
И в моделях я ищу, или сортировки.
Каков самый простой способ кешировать этот список моделей и как я могу использовать кеш-список вместо создания нового списка?
Вот мой полный код ActionResult Index()
[OutputCache(Duration = 120, VaryByParam = "*")]
[AuthLog(Roles = "SuperAdmin")]
public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)
{
ViewBag.CurrentSort = sortOrder;
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "Name_desc" : "";
ViewBag.EmailSortParm = sortOrder == "Email" ? "Email_desc" : "Email";
if (searchString != null)
page = 1;
else
searchString = currentFilter;
ViewBag.CurrentFilter = searchString;
List<ApplicationUser> appUsers = _context.Users.ToList();
List<RegisterViewModel> models = new List<RegisterViewModel>();
foreach (var au in appUsers)
{
RegisterViewModel rvm = new RegisterViewModel(au);
rvm.RoleName = UserManager.GetRoles(au.Id).First();
models.Add(rvm); //new RegisterViewModel(au));
}
if (!String.IsNullOrEmpty(searchString))
models = models.Where(s => s.Name.ToUpper().Contains(searchString.ToUpper()) || s.Email.ToUpper().Contains(searchString.ToUpper())).ToList();
switch (sortOrder)
{
case "Name_desc":
models = models.OrderByDescending(x => x.Name).ToList();
break;
case "Email_desc":
models = models.OrderByDescending(x => x.Email).ToList();
break;
case "Email":
models = models.OrderBy(x => x.Email).ToList();
break;
default:
models = models.OrderBy(x => x.Name).ToList();
break;
}
int pageSize = 20;
int pageNumber = (page ?? 1);
ViewBag.Title = "Použivatelia";
return View(models.AsEnumerable().ToPagedList(pageNumber, pageSize));
}
Вы пробовали [MemoryCache] (https://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache (v = vs.110) .aspx) класс ? –
Я бы сначала исследовал, почему для поиска и сортировки требуется много времени. Предполагая, что вы используете базу данных в качестве хранилища, вы можете исправить это с помощью индекса или 2, индексированного представления или чего-то еще. Если общий список пользователей невероятно длинный или часто изменяется, то в хранилище памяти, вероятно, не лучший способ. Даже с миллионами записей в таблице данных мелкозернистый запрос и соответствующие индексы должны возвращать результаты относительно быстро. Кроме того, возможно, это даже не база данных, которая медленная, но что-то еще вы загружаете. Вы не сможете сказать без какого-либо профилирования. – Igor