Я пытаюсь создать 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 не самый лучший.