簡體   English   中英

如何映射表達式 <func<Entity,DTO> &gt;使用automapper

[英]how to map expression<func<Entity,DTO>> with automapper

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,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null],[System.Boolean,mscorlib] ,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]],mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 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,PublicKeyToken = b77a5c561934e089]],mscorlib,Version = 4.0。 0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]

目標路徑:表達式`1

來源價值:p =>((p.CodUnidade == 1)AndAlso(p.CodTrabalho == 1))

使用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來執行過濾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM