我的模型类设置了整数属性,就像它们存储在数据库中一样。因此,示例模型可能如下所示:
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行的映射代码。
答案 0 :(得分:7)
您可以使用类型转换器执行此操作:
Mapper.CreateMap<int, TaskStatus>()
.ProjectUsing(src => (TaskStatus)src);
这将在任何地方使用。你必须这样做的原因是因为一些LINQ提供程序有不同的处理枚举转换和持久性的方法,所以你必须使用它期望的正确表达式(并且AutoMapper不会假设它知道什么是EF或NHibernate或者需要什么)