如何使用WebApi2指定结果的形状,使用$ expand指定OData

时间:2013-12-09 03:07:53

标签: entity-framework asp.net-web-api odata automapper entity-framework-6

在使用具有特定$select$expand值的OData时,我在执行AutoMapper映射时遇到问题。

使用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会更改响应的形状,因此它不再匹配BookuRequest的IQueryable,而是返回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; }
}

我的映射定义如下:

Mapper.CreateMap<BookInRequest, BookInRequestDto>();
Mapper.CreateMap<BookInDocument, BookInDocumentDto>()
        .ForMember(x => x.Properties, 
          y => y.MapFrom(z => 
                   DynamicHelpers.PropertiesAsDynamic(z.Properties)));

0 个答案:

没有答案