文章出處

示例代碼:

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;
}

參考資料:


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()