如何映射表达式<func <entity,dto>&gt; with automapper </func <entity,dto>

时间:2013-11-01 19:26:54

标签: c# linq expression automapper func

CreateMap

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 -> Expression 1   System.Linq.Expressions.Expression 1[[System.Func 2 [[Unidade,Dominio,   版本= 1.0.0.0,文化=中立,   PublicKeyToken = null],[System.Boolean,mscorlib,Version = 4.0.0.0,   Culture = neutral,PublicKeyToken = b77a5c561934e089]],mscorlib,   Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]] - &gt;   System.Linq.Expressions.Expression 1[[System.Func -2 - [[unidadeDTO,   Infraestrutura,版本= 1.0.0.0,文化=中立,   PublicKeyToken = null],[System.Boolean,mscorlib,Version = 4.0.0.0,   Culture = neutral,PublicKeyToken = b77a5c561934e089]],mscorlib,   Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]

     

目标路径:表达式`1

来源价值: p =&gt; ((p.CodUnidade == 1)AndAlso(p.CodTrabalho == 1))

1 个答案:

答案 0 :(得分: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来执行过滤的。