According to this link
https://learn.microsoft.com/pl-pl/aspnet/core/data/ef-mvc/sort-filter-page?view=aspnetcore-3.1
I created a pagination in my asp.net core with EF application.
Becouse I have huge amount of records (over 1 milion) when I'm trying to get last pages it takes enormous amount of time (over 30 sec).
Is there a way to speed this up?
Here is my Method which returns PaginatedList
public static async Task<PaginatedList<Entry>> CreateAsync(IQueryable<Entry> source, int pageIndex, int pageSize)
{
var indexToGet = (pageIndex - 1) * pageSize;
var count = await source.CountAsync();
var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
return new PaginatedList<Entry>(items, count, pageIndex, pageSize);
}
This line is responsible for slow performance. It seems like Skip and Take methods take a long time to proceed.
var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
EDIT
My queries step by step.
- Getting all the records.
public async Task<IQueryable<Entry>> GetAll()
{
var res = _context.Entries;
return res;
}
- Sorting.
switch (sortOrder)
{
case "who_desc":
entries = entries.OrderByDescending(r => r.Who);
break;
case "Who":
entries = entries.OrderBy(r => r.Who);
break;
case "date_desc":
entries = entries.OrderByDescending(r => r.DateUtc);
break;
default:
entries = entries.OrderBy(r => r.DateUtc);
break;
}
- Returning to the View
return View(await PaginatedList<Entry>.CreateAsync(entries.AsNoTracking(), pageNumber ?? 1, pageSize));
And here is my Entry
public class Entry
{
public long Id { get; set; }
public string Number { get; set; }
public string Who { get; set; }
public long Date { get; set; }
}
Here is SQL query produced by EF Core
Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (59,703ms) [Parameters=[@__p_1='?', @__p_0='?'], CommandType='Text', CommandTimeout='30']
SELECT "e"."Id", "e"."Date", "e"."Number", "e"."Who"
FROM "Entries" AS "e"
ORDER BY "e"."Date"
LIMIT @__p_1 OFFSET @__p_0