【发布时间】:2018-06-05 00:34:46
【问题描述】:
我正在尝试从我的 Order 模型投影到我的 OrderDTO 模型。 Order 有一个枚举。问题是如果我尝试从枚举中获取 Description 属性,则投影不起作用。这是我的代码:
-
OrderStatus.cs:
public enum OrderStatus { [Description("Paid")] Paid, [Description("Processing")] InProcess, [Description("Delivered")] Sent } -
Order.cs:
public class Order { public int Id { get; set; } public List<OrderLine> OrderLines { get; set; } public OrderStatus Status { get; set; } } -
OrderDTO.cs:
public class OrderDTO { public int Id { get; set; } public List<OrderLineDTO> OrderLines { get; set; } public string Status { get; set; } }
在我的 AutoMapper.cs 中使用以下配置:
cfg.CreateMap<Order, OrderDTO>().ForMember(
dest => dest.Status,
opt => opt.MapFrom(src => src.Status.ToString())
);
投影有效,但我得到一个 OrderDTO 对象,如下所示:
- Id: 1
- OrderLines: List<OrderLines>
- Sent //I want "Delivered"!
我不希望 Status 属性为“已发送”,我希望它作为其关联的 Description 属性,在本例中为“已交付”。
我尝试了两种解决方案,但都没有奏效:
ResolveUsing 不支持投影,请参阅关于 LINQ 投影的 wiki 了解支持的操作。
-
使用静态方法通过反射返回String中的Description属性。
cfg.CreateMap<Order, OrderDTO>().ForMember( dest => dest.Status, opt => opt.MapFrom(src => EnumHelper<OrderStatus>.GetEnumDescription(src.Status.ToString())) );
但这给了我以下错误:
LINQ to Entities 无法识别方法 'System.String GetEnumDescription(System.String)' 方法,并且该方法不能 翻译成商店表达式。
那么,我该如何实现呢?
【问题讨论】:
-
只是跳出框框思考,你不能像描述一样将你的枚举重命名
Sent为Delivered吗?此外,区分Sent和Delivered会很好,因为它们是两种不同的状态。 -
@jmesolomon 没关系。这只是我认为的一个例子
-
@Sergio 看到这个答案,这将帮助你stackoverflow.com/a/50434045/3901530
-
ProjectTo 没有简单的方法可以做到这一点,但您可以查看NeinLinq。
标签: c# reflection enums automapper projection