如何使用自动映射器映射表达式<func<Entity,DTO>>

Posted

技术标签:

【中文标题】如何使用自动映射器映射表达式<func<Entity,DTO>>【英文标题】:how to map expression<func<Entity,DTO>> with automapper 【发布时间】:2013-11-13 01:55:57 【问题描述】:

创建地图

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

自动映射器异常:

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

映射类型:表达式1 -&gt; Expression1 System.Linq.Expressions.Expression1[[System.Func2[[Unidade, Dominio, 版本=1.0.0.0,文化=中性, PublicKeyToken=null],[System.Boolean, mscorlib, 版本=4.0.0.0, 文化=中性,PublicKeyToken=b77a5c561934e089]],mscorlib, 版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089]] -> System.Linq.Expressions.Expression1[[System.Func2[[unidadeDTO, 基础设施,版本=1.0.0.0,文化=中性, PublicKeyToken=null],[System.Boolean, mscorlib, 版本=4.0.0.0, 文化=中性,PublicKeyToken=b77a5c561934e089]],mscorlib, 版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089]]

目标路径:表达式`1

来源价值: p => ((p.CodUnidade == 1) AndAlso (p.CodTrabalho == 1))

【问题讨论】:

我认为你不能在Expressions 上使用自动映射器。您通常将表达式用作查询的一部分,然后将这些查询的结果自动映射到不同的类。 你能显示CreateMap 语句吗? Mapper.CreateMap(); Mapper.CreateMap(); 好的,所以你想映射常规对象。你想用第二个Mapper.Map 语句实现什么?现在,您正试图将一个表达式复制到另一个表达式,但您显然不打算这样做(而且这是不可能的)。 好的。我需要从存储库映射过滤器到 dao。 【参考方案1】:

使用表达式和 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 来执行过滤的。

【讨论】:

以上是关于如何使用自动映射器映射表达式<func<Entity,DTO>>的主要内容,如果未能解决你的问题,请参考以下文章

简单的自动映射器示例

当我的类中有属性具有默认构造函数来提供值自动映射器时,如何映射?

无法使用自动映射器映射内部导航属性。 EF 核心

mapper映射器

如何在使用自动映射器时将属性名称的 jsonproperty 设置为 dto?

自动映射器。来自 json 的映射属性