Веб-API OData Entity Framework 6.0 и AutoMapper v9.0 - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь создать API с OData впервые. Я достиг этого, вернув объект базы данных следующим образом:

// In the controller
[EnableQuery]
[UseTransactions]
[Route("GetQueryableTipificaciones")]
public IQueryable<TipificacionDao> GetQueryableTipificaciones()
{
    var factory = new TipificacionFactory();
    var tipificaciones = factory.GetQueryableTipificaciones();
    return tipificaciones;
}


// This in TipificacionFactory
public IQueryable<TipificacionDao> GetQueryableTipificaciones()
{
    var db = (CRMContext)HttpContext.Current.Items["DbContext"];
    return db.Tipificacion;
}

Но я не чувствую себя комфортно, выставляя объект DAO, и я уже сделал TipificationDTO.

Итак, я хочу сделать что-то вроде этого

public IQueryable<TipificacionDto> GetQueryableTipificaciones()
{
    var db = (CRMContext)HttpContext.Current.Items["DbContext"];
    return db.Tipificacion.ProjectTo<TipificacionDto>();
}

Как я видел в этом посте (второй ответ) Web API Queryable - как применить AutoMapper?

Но это всегда выдает эту ошибку

Никакая перегрузка метода 'ProjectTo' не принимает 0 аргументов

Я пытался следовать документации и делать что-то подобное

public IQueryable<TipificacionDto> GetQueryableTipificaciones()
{
    var db = (CRMContext)HttpContext.Current.Items["DbContext"];
    return db.Tipificacion.UseAsDataSource().For<TipificacionDto>();
}

Но это бросает

У 'DbSet' нет никакого определения для UseAsDataSource, также не найдено никакого расширения UseAsDataSource, которое принимает первый аргумент типа 'DbSet'

http://docs.automapper.org/en/stable/Expression-Translation- (UseAsDataSource). html

Еще одна вещь, которую я пытаюсь это

[EnableQuery]
public IQueryable<TipificacionDto> GetQueryableTipificaciones(ODataQueryOptions<TipificacionDto> queryOptions)
{
     IMapper iMapper = Mapeos.Mapper.Configuracion.CreateMapper();
     var db = (CRMContext)HttpContext.Current.Items["DbContext"];
     return db.Tipificacion.ProjectTo<TipificacionDto(iMapper.ConfigurationProvider);
}

И бросает

«ExceptionMessage»: «Не удается разрешить это в выражении Queryable»

My Конфигурация сопоставления:

public class TipificacionProfile : Profile
{
    public TipificacionProfile()
        {
CreateMap<TipificacionDao, TipificacionDto>()
      .ForMember(dest => dest.TipoAdjuntos, opt => opt.MapFrom<TipoAdjuntoCustomDtoResolver>())
      .ForMember(dest => dest.TipoCampos, opt => opt.MapFrom<TipoCamposCustomDtoResolver>())
            ;
     }

}

public class TipoAdjuntoCustomDtoResolver : IValueResolver<TipificacionDao, TipificacionDto, ICollection<TipoAdjuntoDto>>
    {
        public ICollection<TipoAdjuntoDto> Resolve(TipificacionDao source, TipificacionDto destination, ICollection<TipoAdjuntoDto> member, ResolutionContext context)
        {
            return source.TipificacionTipoAdjunto.Select(x => context.Mapper.Map<TipificacionTipoAdjuntoDao, TipoAdjuntoDto>(x)).ToList();
        }
    }
    public class TipoCamposCustomDtoResolver : IValueResolver<TipificacionDao, TipificacionDto, ICollection<TipoCampoDto>>
    {
        public ICollection<TipoCampoDto> Resolve(TipificacionDao source, TipificacionDto destination, ICollection<TipoCampoDto> member, ResolutionContext context)
        {
            return source.TipificacionTipoCampo.Select(x => context.Mapper.Map<TipificacionTipoCampoDao, TipoCampoDto>(x)).ToList();
        }
    }


Похоже, что последняя версия не работает, потому что я не могу использовать настраиваемые средства разрешения

Automapper ResolveUsing причина "Не удается разрешить это в выражении запроса"

Я не видел пример использования UseAsDataSource (), я что-то упустил?

У меня заканчиваются идеи.

Заранее спасибо и извините если мой Engli sh не самый лучший.

...