将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,所以异常中的链接对我来说没有意义
有人遇到过这种情况吗?
对于阅读此问题的人来说,以下是我如何将方法转换为async:
return await GetDbContext().Items
.ProjectTo<DTO>(automapperConfigProvider)
.Where()
.DecompileAsync()
.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