Как использовать ProjectTo с Automapper 8.0 Внедрение зависимостей - PullRequest
0 голосов
/ 29 ноября 2018

Я использую шаблон 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 без передачи конфигурации в метод расширения.Как мне это сделать?

1 Ответ

0 голосов
/ 29 ноября 2018

Начиная с 8.0, вы можете использовать IMapper.ProjectTo

Это означает, что теперь интерфейс IMapper имеет метод ProjectTo (аналогично Map).Таким образом, хотя вам все еще нужно вводить IMapper (но вам все равно это нужно, если вы используете Map, поэтому нет разницы), вам не нужен метод QueryableExtensions и ProjectTo extension - выпросто используйте метод интерфейса (аналогично Map):

return await _mapper.ProjectTo<SomeViewModel>(dbContext.SomeEntity)
    .ToListAsync();

Обратите внимание, что между _mapper.ProjectTo и Select(_mapper.Map) есть принципиальное различие - первое преобразовано в SQL и исполняемый серверсторона, в то время как последнее приводит к оценке клиента и нуждается в Include / ThenInclude (или отложенной загрузке) для правильной работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...