I have a thousands of users in my MVC APP and I use sort, paging and searching in my table of users (by this tutorial), but it takes a too long to load, sort or search.
So I have list of users
List<ApplicationUser> appUsers = _context.Users.ToList();
and I have list of models
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));
}
And in models I search, or sort.
What is the simplest way to cache this list of models and how can I use cached list instead of creating new list?
Here is my complete code of 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));
}