2014-11-14 4 views
0

Я пытаюсь достичь функциональности поиска более чем на 10 тысяч записей. Это связано с проблемами скорости при использовании PagedList.PagedList Search, страдающий от неэффективности

public ActionResult CrmBlogGroupType(int? page, bool? Name, bool? AuthorTitle, bool? Description, string search, int? PageSize, string type) 
{ 
    try 
    { 
    if (type==null) 
    { 
     type = "A"; 
    } 
    IEnumerable<Usp_getBlogSetPosts_Result> _objBlogSet = _dataLayer.GetBlogSet(type); 
    //The above _objBlogSet has around 10 thousand records 

    ViewBag.CurrentPage = page; 

    ViewBag.Name = Name ==null?false:Name; 
    ViewBag.AuthorTitle = AuthorTitle == null ? false : AuthorTitle; 
    ViewBag.Description = Description == null ? false : Description; 

    ViewBag.Search = search; 
    ViewBag.type = type; 

    if (Name == true && AuthorTitle == false && Description == false) 
    { 
     _objBlogSet = _objBlogSet.Where(p => p.author_name.ToLower().Contains(search.ToLower())).ToPagedList(page ?? 1, PageSize ?? 10); 
    } 

    return View(_objBlogSet); 

    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

ответ

1

Я предполагаю, что вы используете список Трой Goode в выгружаемого (https://github.com/TroyGoode/PagedList)

Вместо того чтобы работать с IEnumerable, стараются работать с IQueryable. Таким образом, разбиение на страницы выполняется на стороне сервера, и производительность будет лучше.

+0

общественного List Get_MVP_Consultants() { List obj_Consultants = _dbContext.Tbl_MVPConsultant.Where (р => p.Visibility == TRUE) .ToList(); return obj_Consultants; } Выше описан метод Datalayer, где я получаю данные. Как я могу изменить этот код на IQueryable .. – Dathatreya

+0

не конвертировать этот список. Как только вы это сделаете, db получает удар, и все возвращается. – lusocoding

+0

Hi @lusocoding Я следил за вашим советом и изменил метод Datalayer, чтобы вернуть IQueryable Result .. Но метод ToPagedList() не позволяет Iqueryable Result .. Как продолжить сейчас. – Dathatreya

0

Все зависит от того, что происходит в _dataLayer.GetBlogSet(). Ваш текущий код, скорее всего, тянет всю таблицу и фильтрует эти данные в памяти.

Этот метод должен возвращать IQueryable<Usp_getBlogSetPosts_Result>, поэтому ToPagedList() «s внутренний Skip() и Take() на этой коллекции будут переведены на запросы SQL.

+0

Можете ли вы изменить мой код, чтобы я мог понять. – Dathatreya