ToPagedListAsync()-源IQueryable的提供程序未实现IDbAsyncQueryProvider

时间:2018-07-11 15:30:15

标签: linq asynchronous model-view-controller

我已经尝试解决了几个小时,却找不到解决方案。 我正在使用Web Api MVC项目,并尝试将IEnumerable列表转换为异步的分页列表。我可以编译,但是在ToPagedListAsync()行上仍然出现运行时错误。

  

源IQueryable的提供程序未实现IDbAsyncQueryProvider。只有实现IDbAsyncQueryProvider的提供程序可以用于Entity Framework异步操作。有关更多详细信息,请参见http://go.microsoft.com/fwlink/?LinkId=287068。”

第一层:

public async Task<IEnumerable<MatchingCriteria>> GetMatchingCriterias(int id)
{
     return await _ctx.MatchingCriterias.Include(mc => mc.RuleDefinition).Where(mc => mc.RuleDefinitionId == id).ToListAsync();
}

第二层:

internal async Task<IEnumerable<MatchingCriteria>> GetMatchingCriterias(int id)
{
    using (CrawlerDbContext db = new CrawlerDbContext())
    {
    var matchCriteriaMgr = new MatchingCriteriaManager(db);
    return await matchCriteriaMgr.GetMatchingCriterias(id);
    }
}

控制器:

public async Task<ActionResult> Index(int? id, string sortOrder, string currentFilter, string searchString, int? page){
    var matchingCriterias = await _crawlerProvider.GetMatchingCriterias(id.Value);

    //...
    IQueryable<MatchingCriteria> matchCrit = matchingCriterias.AsQueryable();
    //Error here -> return View(await matchCrit.ToPagedListAsync(pageNumber, pageSize));
}

如果我改为在控制器中这样做:

var matchingCriterias = _db.MatchingCriterias.Include(mc => mc.RuleDefinition);

然后:

return View(await matchingCriterias.ToPagedListAsync(pageNumber, pageSize)

那很好!

我可以在嵌套方法上​​返回DbSet,但不能在第一层使用ToListAsync();

有没有办法使列表可查询?
还有其他想法或建议吗?

1 个答案:

答案 0 :(得分:0)

好吧,我自己通过创建here

来创建AsyncQueryable扩展名来修复了该问题

然后我可以像下面这样调用pagedListAsync()方法:

return View(await matchingCriterias.AsAsyncQueryable().ToPagedListAsync(pageNumber, pageSize)