Я использую следующее:
- EntityFrameworkCore 3.1.2
- . Net Стандартная библиотека 2.1
- Automapper 9.0.0
- Automapper.Extension.Microsoft.DependencyInjection 7.0.0
Мой DI для AutoMapper выглядит следующим образом:
services.AddAutoMapper(Assembly.GetExecutingAssembly());
У меня есть IMapFrom с реализацией по умолчанию:
using AutoMapper;
namespace Application.Common.Mappings
{
public interface IMapFrom<T>
{
void Mapping(Profile profile) => profile.CreateMap(typeof(T), GetType());
}
}
У меня есть класс DTO следующим образом:
public class ServiceRegistrationDto : IMapFrom<ServiceRegistration>
{
public string ServiceName { get; set; }
public string MessageType { get; set; }
public string ServiceURL { get; set; }
public void Mapping(Profile profile)
{
profile.CreateMap<ServiceRegistration, ServiceRegistrationDto>();
}
}
В моем обработчике я делаю следующее:
public async Task<ServiceRegistrationViewModel> Handle(GetServiceRegistrationListQuery request, CancellationToken cancellationToken)
{
var serviceRegistrations = await _context.ServiceRegistrations
.Where(s => s.MessageType.Equals(request.MessageType, StringComparison.InvariantCultureIgnoreCase))
.ProjectTo<ServiceRegistrationDto>(_mapper.ConfigurationProvider)
.ToListAsync(cancellationToken);
return null;
}
Проблема в том, что "ProjectTo" не является определение IQueryable. У меня сложилось впечатление, что у Automapper есть Queryable Extensions. Я пропускаю пакет NuGet? Я слежу за примерами от Northwind Traders и не могу понять, что у меня отличается.
Я могу добраться до "ProjectTo" с помощью IMapper, например:
var x = _mapper.ProjectTo<ServiceRegistrationDto>(serviceRegistrations);
Но я бы предпочел сделать это как часть IQueryable, как вы должны.