我正在尝试在超过1万条记录上实现搜索功能。使用PagedList时遇到速度问题。
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;
}
}
答案 0 :(得分:1)
我假设您正在使用Troy Goode的分页列表(https://github.com/TroyGoode/PagedList)
不要使用IEnumerable,而是尝试使用IQueryable。 这样,分页就在服务器端完成,性能会更好。
答案 1 :(得分:0)
这完全取决于_dataLayer.GetBlogSet()
中发生的事情。您当前的代码很可能会拉入整个表格,并在内存中过滤该数据。
该方法应返回IQueryable<Usp_getBlogSetPosts_Result>
,因此该集合上的ToPagedList()
内部Skip()
和Take()
将转换为SQL查询。