具有不同属性类型的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