Entity framework core 如何将ProjectTo与Automapper 8.0依赖项注入一起使用

Entity framework core 如何将ProjectTo与Automapper 8.0依赖项注入一起使用,entity-framework-core,automapper,Entity Framework Core,Automapper,我正在我的项目中使用Automapper的(8.0)DI模式,并希望在我的实体框架核心实体查询中开始使用ProjectTo 以下是我成功完成工作的一个例子: public async Task<IEnumerable<SomeViewModel>> GetStuffAsync() { return await _dbContext.SomeEntity .ProjectTo<SomeViewModel>(_mapper.Configu

我正在我的项目中使用Automapper的(8.0)DI模式,并希望在我的实体框架核心实体查询中开始使用ProjectTo

以下是我成功完成工作的一个例子:

public async Task<IEnumerable<SomeViewModel>> GetStuffAsync() {

    return await _dbContext.SomeEntity
        .ProjectTo<SomeViewModel>(_mapper.ConfigurationProvider)
        .ToListAsync();
}
    
但是,该方法返回0条记录(以前的方法返回所有记录),并且该方法需要从异步转换为同步,因为扩展Select不支持ToListAsync()。很明显我遗漏了什么。另外,我不确定这是否是正确的技术,因为第二组文档讨论了在不将配置传递给扩展方法的情况下使用8.0版的IMapper.ProjectTo。我该怎么做

从8.0开始,您可以使用IMapper.ProjectTo

这意味着现在
IMapper
接口有一个方法
ProjectTo
(类似于
Map
)。因此,虽然您仍然需要注入
IMapper
(但如果您使用
Map
,则无论如何都需要它,因此没有区别),但您不需要
QueryableExtensions
ProjectTo
扩展方法-您只需使用接口方法(类似于
Map
):

return await\u mapper.ProjectTo(dbContext.SomeEntity)
.ToListAsync();


请注意,
\u mapper.ProjectTo
Select(\u mapper.Map)
之间有着根本的区别——前者被翻译成SQL并在服务器端执行,而后者导致并需要
包含
/
然后包含
(或延迟加载)才能正常工作。

我也有同样的问题,这对我很有用:

var teacher = _mapper.ProjectTo<TeacherReadDto>(_applicationDb.Teachers.Where(x=>x.Id==id));
var teacher=\u mapper.ProjectTo(\u applicationDb.Teachers.Where(x=>x.Id==Id));

这就成功了。文档中是否有我遗漏的关于此功能的参考或示例?没有。正如您所知,没有AutoMapper API参考。因此,
IMapper.ProjectTo
仅在您文章的第二个链接中提到。当然VS Intellisense:)我在尝试让它与QueryableExtensions一起工作时遇到了麻烦,这确实需要添加到文档中。如果我正确理解Ivan的答案,那么这两个答案中的哪一个是最好的,\u mapper.ProjectTo还是选择(\u mapper.Map)?
return await _mapper.ProjectTo<SomeViewModel>(dbContext.SomeEntity)
    .ToListAsync();
var teacher = _mapper.ProjectTo<TeacherReadDto>(_applicationDb.Teachers.Where(x=>x.Id==id));