[英]Caching a list in ASP.NET MVC 5
我的MVC APP中有成千上万的用户,并且在用户表中使用了排序,分页和搜索功能( 通过本教程 ),但是加载,排序或搜索时间太长。
所以我有用户列表
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));
}
我认为您需要在数据库而不是内存中进行排序和过滤。
不知道您的-_context是什么,但假设它是某种ORM。 问题是您在进行任何排序或筛选之前调用ToList,这意味着所有事情都由代码在内存中完成。 如果使用ORM功能,则可以通过简单地允许它生成更有效的SQL查询来避免缓存。
您需要对数据库进行分页和排序,而不要撤回数千行,然后对这些行进行分页或排序。
当您调用.ToList()时,它是向数据库发出信号,要求您退回所有记录,然后将其撤回表中的数千条记录,然后才将排序和分页应用于已带回到内存中的那些记录。
而不是查询,它仅根据页面大小和页数拉回10条排序的记录,而是拉回4000,然后进行排序/分页。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.