Я хочу запросить 1 миллион строк с помощью структуры сущностей, а затем разбить их на страницы. Я использую библиотеку pagedlist.mvc, и это не проблема для первой страницы, потому что я использовал .ToPagedList(pageNumber, pageSize)
в своем коде, и нет необходимости загружать все мои данные.
var allrows = db.works.Where(x => x.Status == 100).OrderByDescending(x => x.ID_Work).ToPagedList(pageNumber, pageSize);
но когда я добавляю действие фильтрации и разбиения по страницам, сначала я должен загрузить все строки, а затем отфильтровать их и после этого использовать .ToPagedList(pageNumber, pageSize)
.
var allrows = db.works.Where(x => x.Status == 100);
if (!String.IsNullOrEmpty(Code_Work))
{
allrows= allrows.Where(x => x.Code_Work.Contains(Code_Work));
ViewBag.CurrentCode_Work = Code_Work;
}
var pagedrows = allrows.OrderByDescending(x => x.ID_Work).ToPagedList(pageNumber, pageSize);
Как я могу справиться с этой проблемой. Я думаю, что это может быть проблемой и снизить производительность. Я не хочу загружать все свои строки.
Вы должны прочитать разницу между IEnumerable и IQueryable
В вашем случае вам нужно сначала сделать запрос фильтра, используя IQueryable
IQueryable<works> worksDetails = db.works.Where(x => x.Status == 100)
.OrderByDescending(x => x.ID_Work); // just creates the sql query to filter records
Наконец, нажмите на базу данных, чтобы получить записи с помощью PagedList.
var pagedrows = worksDetails.ToPagedList(pageNumber, pageSize);
// hits the database and executes the sql query to filter records
Надеюсь это поможет.
@AliSHelcid, да, правильно, это хорошо, потому что он сначала создает запрос, а затем запускает его в базе данных. Таким образом, из базы данных извлекаются только отфильтрованные записи. Но в случае IEnumerable
все 1 миллион строк извлекаются из базы данных, а затем фильтруются данные, поэтому происходит потеря производительности.
хорошо, а затем, когда мы используем IQueryable, он не загружает данные? хорошо.