Как указать форму результатов с помощью WebApi2, OData с расширением $
У меня проблема с выполнением сопоставлений AutoMapper при использовании OData с конкретными $select
или же $expand
ценности.
Использование действия WebApi:
public IQueryable<BookInRequestDto> Get(ODataQueryOptions<BookInRequest> query)
{
var results = query.ApplyTo(_context.BookInRequests) as IQueryable<BookInRequest>;
var mappedResults = Mapper.Map<IQueryable<BookInRequest>, IQueryable<BookInRequestDto>>(results);
return mappedResults;
}
Когда я запрашиваю: api/Get
Я получаю соответствующий ответ, но документ Properties
установлен в null
ответ, содержащий свойства документа со значением NULL.
Когда я запрашиваю: api/Get?$expand=Documents/Properties
ответом является пустой массив.
Как я понимаю, это потому, что Select/Expand изменяет форму ответа, поэтому он больше не соответствует IQueryable из BookInRequest и вместо этого возвращает IQueryable.
Я рад вернуть это, за исключением того, что мне нужно иметь возможность применять сопоставления AutoMapper. Можно ли что-нибудь сделать, чтобы обеспечить форму результатов запроса?
У меня есть следующие лица:
public class BookInRequest {
//...
public virtual ICollection<BookInDocument> Documents { get; set; }
}
public class BookInDocument {
public ICollection<BookInDocumentProperty> Properties { get; set; }
}
С соответствующими DTO, которые в значительной степени идентичны, за исключением BookInDocumentDto
:
public class BookInDocumentDto {
public dynamic Properties { get; set; }
}
Мое определение Mapping выглядит следующим образом:
Mapper.CreateMap<BookInRequest, BookInRequestDto>();
Mapper.CreateMap<BookInDocument, BookInDocumentDto>()
.ForMember(x => x.Properties,
y => y.MapFrom(z =>
DynamicHelpers.PropertiesAsDynamic(z.Properties)));