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

dam*_*c88 5 entity-framework automapper odata asp.net-web-api entity-framework-6

$select当我使用具有特定或值的 OData 时,执行 AutoMapper 映射时遇到问题$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;
    }
Run Code Online (Sandbox Code Playgroud)

当我查询: 时api/Get,我得到了适当的响应,但文档的响应Properties被设置null为包含设置为 null 的文档属性。

当我查询: 时api/Get?$expand=Documents/Properties,响应是一个空数组。

据我了解,这是因为 Select/Expand 改变了响应的形状,因此它不再匹配 BookInRequest 的 IQueryable,而是返回 IQueryable。

我很高兴返回该信息,但我需要能够应用 AutoMapper 映射。有什么办法可以强制执行查询结果的形状吗?

我有以下实体:

public class BookInRequest {
    //...
    public virtual ICollection<BookInDocument> Documents { get; set; }
}

public class BookInDocument {
    public ICollection<BookInDocumentProperty> Properties { get; set; }     
}
Run Code Online (Sandbox Code Playgroud)

对应的 DTO 几乎相同,除了BookInDocumentDto

public class BookInDocumentDto {
    public dynamic Properties { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的映射定义如下:

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