分页后对 UserManager<T> 进行额外的异步调用
Posted
技术标签:
【中文标题】分页后对 UserManager<T> 进行额外的异步调用【英文标题】:Make additional asynchronous call to UserManager<T> after pagination 【发布时间】:2021-05-11 16:36:54 【问题描述】:我有一个 LINQ 查询,它通过过滤和分页从数据库中获取结果,并将结果映射到 PaginatedList<T>
。
var bookReservationList = await _dbContext.BookReservations
.Include(x => x.Books).Select(
book => new BookRequestViewModel
Author = book.Books.Author
).PaginatedListAsync(pageNumber, pageSize);
现在有了从上述 LINQ 查询中的bookReservationList
获得的结果,我想调用GetUserEmailAsync
来获取
Requester = await _identityService.GetUserEmailAsync(book.RequesterId)
,这是对UserManager<T>
的调用
我一直在尝试这种方式,但我失败了:将结果映射到 Task
var res = bookReservationList.Items.Select(async y => new BookRequestViewModel
Requester = await _identityService.GetUserEmailAsync(y.RequesterId);
);
分页列表异步
public static Task<PaginatedList<TDestination>> PaginatedListAsync<TDestination>(this IQueryable<TDestination> queryable, int pageNumber, int pageSize)
return PaginatedList<TDestination>.CreateAsync(queryable, pageNumber, pageSize);
分页列表
public class PaginatedList<T>
public List<T> Items get;
public int PageIndex get;
public int TotalPages get;
public int TotalCount get;
public PaginatedList(List<T> items, int count, int pageIndex, int pageSize)
PageIndex = pageIndex;
TotalPages = (int)Math.Ceiling(count / (double)pageSize);
TotalCount = count;
Items = items;
public bool HasPreviousPage => PageIndex > 1;
public bool HasNextPage => PageIndex < TotalPages;
public static async Task<PaginatedList<T>> CreateAsync(IQueryable<T> source, int pageIndex, int pageSize)
var count = await source.CountAsync();
var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
return new PaginatedList<T>(items, count, pageIndex, pageSize);
GetUserEmailAsync
的实现如下:
public interface IIdentityService
Task<string> GetUserEmailAsync(string userId);
视图模型
public class BookRequestViewModel
public int Id get; set;
public string Requester get; set;
public string RequesterId get; set;
public DateTime RequestDate get; set;
基本上,我想将结果返回为
Task<PaginatedList<BookRequestViewModel>> GetRequestedBookList(int pageNumber, int pageSize);
但没有这样做。
【问题讨论】:
but failing to do so.
具体是什么失败了?
我无法将第二次异步调用后获得的结果映射为返回Task<PaginatedList<BookRequestViewModel>>
。
所以你有某种IdentityDbContext
?恕我直言,跳过UserManager
,只需在模型中定义从书到用户的导航,然后在查询中选择用户电子邮件。
是的,我一直在使用 IdentityDbContext。但是,正如你所说,没有从书到用户的导航,所以我不得不使用 UserManager 拨打电话。由于我的项目结构,我无法从实体访问ApplicationUser
。
【参考方案1】:
你不能用 LINQ 做到这一点。你必须使用foreach
foreach (y in bookReservationList.Items)
y.Requester = await _identityService.GetUserEmailAsync(y.RequesterId);
【讨论】:
以上是关于分页后对 UserManager<T> 进行额外的异步调用的主要内容,如果未能解决你的问题,请参考以下文章