使用 Enum 属性 从具有整数 属性 的模型投影到 class
Projecting from a model with an integer property to class with Enum property
我的模型 classes 设置了整数属性,就像它们存储在数据库中一样。因此示例模型可能如下所示:
public class TaskModel
{
public int TaskId { get; set; }
public int TaskStatus { get; set; }
}
但是在我的实际业务中 classes 我想使用枚举,所以匹配的业务 class 看起来像:
public class Task
{
public int TaskId { get; set; }
public Status TaskStatus { get; set; }
}
然后我想使用 Automapper 的 LINQ 投影功能来查询这些业务 classes,例如:
return db.Tasks.Where( t => t.TaskStatus == 1 ).Project().To<Task>();
但是当我这样做时我得到这个错误:
Unable to create a map expression from System.Int32 to MyNamespace.TaskStatus
我已经能够通过这样设置映射来解决它:
Mapper.CreateMap<TaskModel, Task>()
.ForMember(t => t.TaskStatus, opt => opt.MapFrom(m => (TaskStatus)m.TaskStatus))
.ReverseMap();
这似乎有效(到目前为止),但我的问题是有更好的或更干燥的方法来做到这一点。问题是我需要对大量模型和 classes 中的大量属性执行此操作。似乎应该有一种更简单的方法来完成本质上简单的强制转换,而不必编写 100 行映射代码。
您可以使用类型转换器来做到这一点:
Mapper.CreateMap<int, TaskStatus>()
.ProjectUsing(src => (TaskStatus)src);
这将无处不在。你必须这样做的原因是因为一些 LINQ 提供者有不同的方式来处理枚举转换和持久性,所以你必须使用它期望的正确表达式(并且 AutoMapper 不假设它知道什么是 EF 或 NHibernate 或任何需要) .
我的模型 classes 设置了整数属性,就像它们存储在数据库中一样。因此示例模型可能如下所示:
public class TaskModel
{
public int TaskId { get; set; }
public int TaskStatus { get; set; }
}
但是在我的实际业务中 classes 我想使用枚举,所以匹配的业务 class 看起来像:
public class Task
{
public int TaskId { get; set; }
public Status TaskStatus { get; set; }
}
然后我想使用 Automapper 的 LINQ 投影功能来查询这些业务 classes,例如:
return db.Tasks.Where( t => t.TaskStatus == 1 ).Project().To<Task>();
但是当我这样做时我得到这个错误:
Unable to create a map expression from System.Int32 to MyNamespace.TaskStatus
我已经能够通过这样设置映射来解决它:
Mapper.CreateMap<TaskModel, Task>()
.ForMember(t => t.TaskStatus, opt => opt.MapFrom(m => (TaskStatus)m.TaskStatus))
.ReverseMap();
这似乎有效(到目前为止),但我的问题是有更好的或更干燥的方法来做到这一点。问题是我需要对大量模型和 classes 中的大量属性执行此操作。似乎应该有一种更简单的方法来完成本质上简单的强制转换,而不必编写 100 行映射代码。
您可以使用类型转换器来做到这一点:
Mapper.CreateMap<int, TaskStatus>()
.ProjectUsing(src => (TaskStatus)src);
这将无处不在。你必须这样做的原因是因为一些 LINQ 提供者有不同的方式来处理枚举转换和持久性,所以你必须使用它期望的正确表达式(并且 AutoMapper 不假设它知道什么是 EF 或 NHibernate 或任何需要) .