【記録】AutoMapper Project To not support ResolveUsing
1906 ワード
サンプルコード:
上のコードに従って記述すると異常が投げ出すので、ORMを使って変換を取得する場合(.Project().To)は、ResolveUsingをサポートしていないので、Jimmy Bogard(AutoMapper作者)は、使用しない場合はQueryable Extensionsを拡張するべきです.Project().To,単純なマッピング変換はResolveUsingをサポートしているが,ResolveUsingを使用することはビジネスロジックコードの作成を容易にすることにほかならない.MapFromを使用して実現することもできる.
参考資料: Queryable Extensions Automapper Project.To Null reference exception Automapper error: Expressions mapping from methods not supported yet Projekt().To in AutoMapper.QueryableExtensions fails when inner property is null
public List<OrderLineDTO> GetLinesForOrder(int orderId)
{
Mapper.CreateMap<OrderLine, OrderLineDTO>()
.ForMember(dto => dto.Item, conf => conf.MapFrom(ol => ol.Item.Name)
.ForMember(dto => dto.Name, opt => opt.ResolveUsing<NameCustomResolver>());
using (var context = new orderEntities())
{
return context.OrderLines.Where(ol => ol.OrderId == orderId)
.Project().To<OrderLineDTO>().ToList();
}
}
public class NameCustomResolver : ValueResolver<OrderLine, string>
{
protected override string ResolveCore(OrderLine source)
{
//
return source.Name;
}
}
上のコードに従って記述すると異常が投げ出すので、ORMを使って変換を取得する場合(.Project().To)は、ResolveUsingをサポートしていないので、Jimmy Bogard(AutoMapper作者)は、使用しない場合はQueryable Extensionsを拡張するべきです.Project().To,単純なマッピング変換はResolveUsingをサポートしているが,ResolveUsingを使用することはビジネスロジックコードの作成を容易にすることにほかならない.MapFromを使用して実現することもできる.
public List<OrderLineDTO> GetLinesForOrder(int orderId)
{
Mapper.CreateMap<OrderLine, OrderLineDTO>()
.ForMember(dto => dto.Item, conf => conf.MapFrom(ol => ol.Item.Name)
.ForMember(dto => dto.Name, opt => opt.MapFrom(ol => NameCustomResolver(ol)));
using (var context = new orderEntities())
{
return context.OrderLines.Where(ol => ol.OrderId == orderId)
.Project().To<OrderLineDTO>().ToList();
}
}
public static string NameCustomResolver(OrderLine source)
{
//
return source.Name;
}
参考資料: