分页后对 UserManager<T> 进行额外的异步调用

Posted

技术标签:

【中文标题】分页后对 UserManager<T> 进行额外的异步调用【英文标题】:Make additional asynchronous call to UserManager<T> after pagination 【发布时间】:2021-05-11 16:36:54 【问题描述】:

我有一个 LINQ 查询,它通过过滤和分页从数据库中获取结果,并将结果映射到 PaginatedList&lt;T&gt;

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&lt;T&gt;的调用

我一直在尝试这种方式,但我失败了:将结果映射到 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&lt;PaginatedList&lt;BookRequestViewModel&gt;&gt; GetRequestedBookList(int pageNumber, int pageSize); 但没有这样做。

【问题讨论】:

but failing to do so. 具体是什么失败了? 我无法将第二次异步调用后获得的结果映射为返回Task&lt;PaginatedList&lt;BookRequestViewModel&gt;&gt; 所以你有某种IdentityDbContext?恕我直言,跳过UserManager,只需在模型中定义从书到用户的导航,然后在查询中选择用户电子邮件。 是的,我一直在使用 IdentityDbContext。但是,正如你所说,没有从书到用户的导航,所以我不得不使用 UserManager 拨打电话。由于我的项目结构,我无法从实体访问ApplicationUser 【参考方案1】:

你不能用 LINQ 做到这一点。你必须使用foreach

foreach (y in bookReservationList.Items)

    y.Requester = await _identityService.GetUserEmailAsync(y.RequesterId);

【讨论】:

以上是关于分页后对 UserManager<T> 进行额外的异步调用的主要内容,如果未能解决你的问题,请参考以下文章

织梦栏目分页实现前十页后十页

aspnetpage 分页后 怎么把序号从1开始排序

分页后数据表jquery点击事件不起作用

朋友,您好,我想问Django分页后查询条件丢失的问题

使用paginate分页后数据处理

c# gridview 分页后根据内容改变字体颜色