Я использую шаблон DI Automapper (8.0) в своем проекте и надеюсь начать использовать ProjectTo в моих запросах к сущности Entity Framework Core.
Вот пример того, что мне удалось заставить работать:
public async Task<IEnumerable<SomeViewModel>> GetStuffAsync() {
return await _dbContext.SomeEntity
.ProjectTo<SomeViewModel>(_mapper.ConfigurationProvider)
.ToListAsync();
}
Вышеуказанный вызов возвращает все ожидаемые записи, но для этого требуется как вставка IMapper в конструктор хранилища, так и ссылка Using на AutoMapper.QueryableExtensions.
Существует дваверсии документов AutoMapper, которые я нашел, и они, кажется, предоставляют противоречивую информацию.
Эти документы https://automapperdocs.readthedocs.io/en/latest/Dependency-injection.html утверждают следующее:
Использование DI эффективно взаимоисключающеес использованием метода расширения IQueryable.ProjectTo.Вместо этого используйте IEnumerable.Select (_mapper.Map) .ToList ().
И эти документы http://docs.automapper.org/en/stable/Dependency-injection.html утверждают это:
Начиная с 8.0, вы можетеиспользовать IMapper.ProjectTo.Для более старых версий необходимо передать конфигурацию методу расширения IQueryable.ProjectTo (IConfigurationProvider).
Следуя примеру первого документа, я преобразовал свой запрос в следующее:
public IEnumerable<SomeViewModel> GetStuff() {
return _dbContext.SomeEntity
.Select(_mapper.Map<SomeViewModel>)
.ToList();
}
Однако этот метод возвращает 0 записей (предыдущий вернул все), и метод необходимо преобразовать из Async в синхронный, поскольку ToListAsync () не поддерживается расширенным Select.Я явно что-то упускаю.Кроме того, я не уверен, что это правильный метод, поскольку во втором наборе документов говорится об использовании IMapper.ProjectTo для версии 8.0 без передачи конфигурации в метод расширения.Как мне это сделать?