c# asp.net-mvc async-await task-parallel-library pagedlist

c# - PagedList y Async



asp.net-mvc async-await (2)

¿Hay una forma razonable de trabajar con PagedList y async?

Sí. No sale de la caja con EF. Pero puede obtener PagedList.EntityFramework que expone una ToPagedListAsync :

Tomado de este problema github :

public class PagedListExtended<T> : BasePagedList<T> { private PagedListExtended() { } public static async Task<IPagedList<T>> Create(IQueryable<T> superset, int pageNumber, int pageSize) { var list = new PagedListExtended<T>(); await list.Init(superset, pageNumber, pageSize); return list; } async Task Init(IQueryable<T> superset, int pageNumber, int pageSize) { if (pageNumber < 1) throw new ArgumentOutOfRangeException("pageNumber", pageNumber, "PageNumber cannot be below 1."); if (pageSize < 1) throw new ArgumentOutOfRangeException("pageSize", pageSize, "PageSize cannot be less than 1."); TotalItemCount = superset == null ? 0 : await superset.CountAsync(); PageSize = pageSize; PageNumber = pageNumber; PageCount = TotalItemCount > 0 ? (int) Math.Ceiling(TotalItemCount/(double) PageSize) : 0; HasPreviousPage = PageNumber > 1; HasNextPage = PageNumber < PageCount; IsFirstPage = PageNumber == 1; IsLastPage = PageNumber >= PageCount; FirstItemOnPage = (PageNumber - 1)*PageSize + 1; var num = FirstItemOnPage + PageSize - 1; LastItemOnPage = num > TotalItemCount ? TotalItemCount : num; if (superset == null || TotalItemCount <= 0) return; Subset.AddRange(pageNumber == 1 ? await superset.Skip(0).Take(pageSize).ToListAsync() : await superset.Skip((pageNumber - 1)*pageSize).Take(pageSize).ToListAsync()); } } public static class PagedListExtendedExtensions { public static async Task<IPagedList<T>> ToPagedListAsync<T>(this IQueryable<T> superset, int pageNumber, int pageSize) { return await PagedListExtended<T>.Create(superset, pageNumber, pageSize); } }

Estoy usando PagedList en mis vistas, pero mi controlador scaffolded se genera con este tipo de acción de índice predeterminada:

public async Task<ActionResult> Index() { return View(await db.Claimants.ToListAsync()); }

No encontré una extensión para que PagedList funcione con async . Mis métodos tienen que cambiarse a una forma como esta:

public ActionResult Index(int? page) { var claimants = db.Claimants.OrderBy(b => b.Name); var notNullPage = page ?? 1; return View(claimants.ToPagedList(notNullPage, 50)); }

¿Hay una forma razonable de trabajar con PagedList y async ?


Sí tu puedes.

Puede usar X.PagedList, que es una versión mejorada de PagedList y admite operaciones asíncronas.