我有一个同步方法,我正在尝试将其转换为异步。基本上,下面的代码将数据投影到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,因此异常中的链接对我没有意义。
有没有人遇到过这个?
答案 0 :(得分:1)
这是因为ProjectToQueryable<T>
未实现IDbAsyncEnumerable
。
但AutoMapper.EF6包中存在异步等效.ProjectToListAsync<T>();
。
答案 1 :(得分:0)
对于阅读此问题的任何人,以下是我将方法转换为异步的方式:
return await GetDbContext().Items
.ProjectTo<DTO>(automapperConfigProvider)
.Where()
.DecompileAsync()
.OrderBy().ThenBy(...)
.Skip(skip).Take(take)
.ToListAsync();
基本上,我希望数据服务器在将数据集投影到DTO,执行查询,然后根据分页信息仅选择结果的子集时完成所有工作。
我探讨了吉米·博加德在对达西答案的评论中提到的UseAsDataSource()
选项。但是我使用AutoMapper Profile
作为我的映射的配置提供程序,我无法弄清楚如何将其转换为IMapper
以传递给UseAsDataSource()
。所以我最终没有按照吉米的建议去做。
我确定还有其他方法可以解决这个问题,但我是通过上面的代码完成的。