2013-11-01 71 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进行过滤。

相关问题