当我将 OData 与特定的对象一起使用时,执行 AutoMapper 映射时遇到问题$select
or $expand
values.
使用 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 改变了响应的形状,因此它不再匹配 BookInRequest 的 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)));