使用ToListAsync()与Automapper ProjectToQueryable()

时间:2016-08-08 02:30:02

标签: c# entity-framework entity-framework-6 automapper

我有一个同步方法,我正在尝试将其转换为异步。基本上,下面的代码将数据投影到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未实现IDbAsyncEnumerable。只有实现IDbAsyncEnumerable的源才能用于Entity Framework异步操作。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=287068

我正在使用EntityFramework,因此异常中的链接对我没有意义。

有没有人遇到过这个?

2 个答案:

答案 0 :(得分:1)

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

AutoMapper.EF6包中存在异步等效.ProjectToListAsync<T>();

详细信息:https://github.com/AutoMapper/AutoMapper.EF6

答案 1 :(得分:0)

对于阅读此问题的任何人,以下是我将方法转换为异步的方式:

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

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

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

我确定还有其他方法可以解决这个问题,但我是通过上面的代码完成的。