【发布时间】:2016-12-29 18:28:28
【问题描述】:
在我的项目中,我有一个可查询的 Linq(实际上是一个 EF6 集合),我需要将其转换为数据传输对象的集合。我在整个项目中使用AutoMapper,尤其是因为它能够进行类型投影,从而减少了 Linq 查询生成的 SQL 数量。
但是我的一个 DTO 课程有一个小问题。关联的数据库列包含一个可以为空的字符串,我希望将其映射到一个可以为空的枚举。但是在运行时会抛出异常
在类型“System.String”和“System.Nullable`1[AutomapperEnumTest.Method]”之间没有定义强制运算符。
这是一个演示问题的完整测试程序:(请参阅.Net Fiddle)
using System;
using System.Linq;
using AutoMapper;
using AutoMapper.QueryableExtensions;
namespace AutomapperEnumTest
{
public class Program
{
public static void Main()
{
Configure();
var src = new SourceType[] { new SourceType { Name = "Rob", MethodName = "AUTO" } };
var results = src.AsQueryable()
.ProjectTo<DestType>();
foreach(var item in results)
{
Console.WriteLine(String.Format("DestType Name={0} Method={1}", item.Name, item.Method));
}
Console.WriteLine("Done");
}
private static void Configure()
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<string, Method?>().ProjectUsing(src => src == "MANUAL" ? Method.MANUAL : Method.AUTO);
cfg.CreateMap<SourceType, DestType>()
.ForMember(dest => dest.Method, opt => opt.MapFrom(src => src.MethodName));
});
}
}
public enum Method
{
MANUAL=0,
AUTO=1
}
public class DestType
{
public string Name {get; set; }
public Method? Method {get; set; }
}
public class SourceType
{
public string Name {get; set; }
public string MethodName {get; set; }
}
}
现在,如果我将属性从Method? 更改为Method,它可以正常工作(请参阅.Net Fiddle 中的此修改)。但我不想这样做,所以我的问题是我如何通知 Linq/AutoMapper 它应该使用我的ProjectUsing 作为可空枚举?
非常感谢。
【问题讨论】:
标签: c# linq exception automapper