具有不同属性类型的AutoMapper对象
我想映射我的实体框架实体(从遗留数据库生成)到自定义的DTO对象(应该很好,干净)。
我的遗留数据库的实体看起来有点像这样:
internal class Order {
int id;
string Shipping_date;
string quantity;
}
我想将它映射到更好的DTO对象:
public class OrderDto {
int id;
DateTime? ShippingDate;
int Quantity;
}
我写了一个“实体容器”来提供依赖注入,它以这种方式返回值:
public IEnumerable<OrderDto> GetPaginatedOrders(int page, int pageSize)
{
return this.db.Orders
.OrderByDescending(c => c.id)
.Paginate(page, pageSize)
.Project()
.To<OrderDto>()
.AsEnumerable();
}
所以:改变类型,改变属性名称。
如果只是改变产权名称,这将是容易但乏味的:
Mapper.CreateMap<Order, OrderDto>()
.ForMember(dest => dest.Quantity, opt => opt.MapFrom(src => src.quantity))
.ForMember(dest => dest.ShippingDate, opt => opt.MapFrom(src => src.Shipping_date));
这对于改变类型是不够的。 我尝试了一大堆东西:
src => int.Parse(src.quantity)
但Linq不喜欢它。 QuantityInt { get { return int.Parse(this.quantity) } }
自定义属性扩展EF实体并在映射中使用它们,但AutoMapper不喜欢它,并且明确地不支持它们。 Mapper.CreateMap<string, int>().ConvertUsing(Convert.ToInt32)
但我仍然Unable to create a map expression from System.String to System.Int32
错误Unable to create a map expression from System.String to System.Int32
。 ResolutionContext.SourceValues
(我猜他们是在AutoMapper获取它们之前丢弃或类似的东西)获得空值。 我意识到AutoMapper是基于约定的,所以也许我应该使用另一个工具,但是哪一个存在?
谢谢你的帮助!
.Project()将Linq用于生成SQL的实体,自然只理解一组非常有限的函数。
如果你使用
Mapper.Map<IEnumerable<Order>, IEnumerable<OrderDto>>(src)
您的转换可以正常工作。
链接地址: http://www.djcxy.com/p/37427.html上一篇: AutoMapper objects with different property types
下一篇: C# AutoMapper Conditional Mapping based upon target value