在我的項目中,我有一個Linq可查詢(實際上是一個EF6集合),我需要將其轉換爲數據傳輸對象的集合。我在整個項目中都使用了AutoMapper
,特別是它能夠執行類型投影,從而減少了Linq查詢生成的SQL數量。當投影到可爲空的枚舉時,AutoMapper拋出異常
但是我的一個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
作爲可空的枚舉?
非常感謝。
感謝您提供這樣一個完整的答案。我測試過了,這確實解決了這個問題。 – Rob