簡體   English   中英

在ASP.NET MVC 5中緩存列表

[英]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,然后進行排序/分頁。

請參閱有關PagedList和排序的文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM