2013-11-01 69 views
0

CreateMap如何映射表達<FUNC <Entity,DTO>>使用automapper

Mapper.CreateMap<Unidade, unidadeDTO>(); 
Mapper.CreateMap<unidadeDTO, Unidade>(); 




public ICollection<Unidade> BuscarPorParametos(Expression<Func<Unidade, bool>> parametros) 
{ 
    return Mapper.Map<ICollection<unidadeDTO>, ICollection<Unidade>>(unidadeDeTrabalho.UnidadeDAO.BuscarPorParametros(Mapper.Map<Expression<Func<Unidade, bool>>, Expression<Func<unidadeDTO, bool>>>(parametros))); 
} 

Automapper例外:

缺少類型映射配置或不支持的映射。

映射類型:表達式 System.Linq.Expressions.Expression 1[[System.Func -2 - [[Unidade,多米尼, 版本= 1.0.0.0,文化=中性 公鑰=空],[System.Boolean,mscorlib程序,版本= 4.0.0.0, 文化=中性公鑰= b77a5c561934e089]],mscorlib程序, 版本= 4.0.0.0,文化=中性公鑰= b77a5c561934e089〕〕 - > System.Linq.Expressions.Expression 1[[System.Func -2 - [[unidadeDTO , Infraestrutura,Version = 1.0.0.0,Culture = neutral, PublicKeyToken = null],[System.Boolean,mscorlib,Version = 4.0.0.0, Culture = neutral,PublicKe yToken = b77a5c561934e089]],mscorlib程序, 版本= 4.0.0.0,文化=中性公鑰= b77a5c561934e089]]

目標路徑:Expression`1

Source值: P =>((對.CodUnidade == 1)AndAlso(p.CodTrabalho == 1))

+2

我不認爲你可以在'Expression'上使用automapper。您通常使用表達式作爲查詢的一部分,然後將這些查詢的結果自動映射到不同的類。 –

+0

你可以顯示'CreateMap'語句嗎? –

+0

Mapper.CreateMap (); Mapper.CreateMap (); – joaoeduardorf

回答

2

使用Expressions和AutoMapper時,需要使用Queryable Extensions名稱空間。

它使用與正常自動映射器不同的語法。通常你會使用它來符合你的查詢來獲得你想要的結果集。

//---- Declared elsewhere 
Mapper.CreateMap<Unidade, unidadeDTO>(); 
Mapper.CreateMap<unidadeDTO, Unidade>(); 
//---- 

public static IQueryable<unidadeDTO> ConvertToDTO(IQueryable<Unidade> source) 
{ 
    return source.Project().To<unidadeDTO>(); 
} 

現在,您可以針對新的IQueryable編寫過濾器表達式,並將更改傳播回原始SQL。這允許你做這樣的

public class OrderLine 
{ 
    public int Id { get; set; } 
    public int OrderId { get; set; } 
    public Item Item { get; set; } 
    public decimal Quantity { get; set; } 
} 

public class Item 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class OrderLineDTO 
{ 
    public int Id { get; set; } 
    public int OrderId { get; set; } 
    public string ItemName { get; set; } 
    public decimal Quantity { get; set; } 
} 

public class OrderDAL 
{ 
    static OrderDAL() 
    { 
     Mapper.CreateMap<OrderLine, OrderLineDTO>() 
      .ForMember(dto => dto.ItemName, conf => conf.MapFrom(ol => ol.Item.Name); 
    } 

    public List<OrderLineDTO> GetLinesForOrder(string itemName) 
    { 
     using (var context = new orderEntities()) 
     { 
     return context.OrderLines.Project().To<OrderLineDTO>() 
       .Where(i => i.ItemName == itemName).ToList(); 
     } 
    } 
} 

注意的事情,我如何使用DTO的屬性ItemName進行過濾。

相關問題