0

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 -> Expression1 System.Linq.Expressions.Expression 1[[System.Func2[[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.Func2[[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))

4

1 に答える 1

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

ItemNameDTOのプロパティを使用してフィルタリングを実行する方法に注目してください。

于 2013-11-01T21:16:28.673 に答える