我正在尝试将源对象映射到DTO:
var queryable = GetDtoQueryable(); //IQueryable<DTO>
return _mapper //IMapper
.Map<IQueryable<Source>,List<DTO>>(queryable);
这个问题是GetDtoQueryable()使用Entity Framework生成IQueryable,因此对Map()的调用是对集合中每个元素的四舍五入。解决这个问题应该很容易:
var queryable = GetDtoQueryable();
return queryable
.ProjectTo<DTO>()
.ToList();
然而,我发现这个映射主要是通过反射使用默认属性映射器,而不是单独建立的自定义转换器:
CreateMap<Source, DTO>()
.ConvertUsing<SourceDtoConverter>();
public class SourceDtoConverter : ITypeConverter<Source, DTO>
{
public DTO Convert(Source source, DTO dest, ResolutionContext context){ ... }
}
我需要ProjectTo()来调用此转换器。我猜这是不可能确保转换器不进行任何调用LinqToEntities无法执行,但我想知道是否有任何替代解决方案,可以避免往返,同时给我自定义转换器的功能。到目前为止,我一直在尝试用ForMember()方法替换它,但这实际上是对这个转换器的重写。