从具有整数属性的模型投影到具有Enum属性的类

时间:2015-04-08 17:44:52

标签: automapper projection

我的模型类设置了整数属性,就像它们存储在数据库中一样。因此,示例模型可能如下所示:

public class TaskModel
{
    public int TaskId { get; set; }
    public int TaskStatus { get; set; }
}

但是在我的实际业务类中,我想使用枚举,因此匹配的业务类看起来像:

public class Task
{
    public int TaskId { get; set; }
    public Status TaskStatus { get; set; }
}

然后,我想使用Automapper的LINQ投影功能来查询这些业务类,例如:

 return db.Tasks.Where( t => t.TaskStatus == 1 ).Project().To<Task>();

但是当我这样做时,我收到了这个错误:

  

无法从System.Int32到MyNamespace.TaskStatus创建地图表达式

我已经能够通过设置映射来解决它:

Mapper.CreateMap<TaskModel, Task>()
   .ForMember(t => t.TaskStatus, opt => opt.MapFrom(m => (TaskStatus)m.TaskStatus))
   .ReverseMap();

这似乎有效(到目前为止),但我的问题是有更好或更干的方法来做到这一点。问题是我需要为大量模型和类中的大量属性执行此操作。似乎应该有一种更简单的方法来完成本质上是一个简单的转换,必须编写100行的映射代码。

1 个答案:

答案 0 :(得分:7)

您可以使用类型转换器执行此操作:

Mapper.CreateMap<int, TaskStatus>()
    .ProjectUsing(src => (TaskStatus)src);

这将在任何地方使用。你必须这样做的原因是因为一些LINQ提供程序有不同的处理枚举转换和持久性的方法,所以你必须使用它期望的正确表达式(并且AutoMapper不会假设它知道什么是EF或NHibernate或者需要什么)