将ToListAsync()与Automapper ProjectToQueryable()一起使用

本文关键字:一起 ProjectToQueryable ToListAsync Automapper | 更新日期: 2023-09-27 18:01:10

我有一个sync方法,我正试图将其转换为async。基本上,下面的代码将数据投影到DTO中,并根据DTO的属性选择行并对其进行排序。它也只获取数据的某个"页面"。

return GetDbContext().Items
            .ProjectToQueryable<DTO>(automapperConfigProvider)
            .Where({expression based on DTO})
            .OrderBy({expression based on DTO}).ThenBy(...)
            .Skip(skip)
            .Take(take)
            .ToList();

我试着这样转换它,但在ToListAsync上失败了。

var query = GetDbContext().Items
            .ProjectToQueryable<DTO>(automapperConfigProvider)
            .Where({expression based on DTO})
            .OrderBy({expression based on DTO}).ThenBy(...)
            .Skip(skip)
            .Take(take);
return await query.ToListAsync();

我得到的例外是:

源IQueryable未实现IDbSyncEnumerable。只有实现IDbSyncEnumerable的源才能用于实体框架异步操作。有关更多详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=287068.

我使用的是EntityFramework,所以异常中的链接对我来说没有意义

有人遇到过这种情况吗?

将ToListAsync()与Automapper ProjectToQueryable()一起使用

对于阅读此问题的人来说,以下是我如何将方法转换为async:

return await GetDbContext().Items
              .ProjectTo<DTO>(automapperConfigProvider)
              .Where()
              .Decompil‌​eAsync()
              .OrderBy().ThenBy(...)
              .Skip(skip).Take(take) 
              .ToListAsync();

基本上,我希望数据服务器完成将数据集投影到DTO和执行查询的所有工作,然后根据分页信息只选择结果的子集。

我探讨了吉米·博加德在对达西回答的评论中提到的UseAsDataSource()选项。但我使用AutoMapper Profile作为映射的配置提供程序,我不太清楚如何将其转换为IMapper并传递给UseAsDataSource()。所以我最终没有按照吉米的建议去做。

我相信还有其他方法可以解决这个问题,但我通过上面的代码做到了。

这是因为ProjectToQueryable<T>不实现IDbAsyncEnumerable

但是,在AutoMapper中有一个异步等价的.ProjectToListAsync<T>();。EF6包装。

此处提供详细信息:https://github.com/AutoMapper/AutoMapper.EF6