![](/img/trans.png)
[英]Map Expression<Func<Dto, bool>> to Expression<Func<Entity, bool>> using 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.Expression1[[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.Expression1[[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.