示例程式碼:
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;
}
參考資料:
- 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