Как указать форму результатов с помощью 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)));

0 ответов

Другие вопросы по тегам