В моем проекте у меня есть запрос Linq (на самом деле коллекция EF6), который мне нужно преобразовать в коллекцию объектов передачи данных. Я использую AutoMapper
на протяжении всего проекта, особенно за его способность выполнять проекцию типа, тем самым уменьшая количество SQL, сгенерированное в результате запроса Linq.AutoMapper выдает исключение при проецировании на nullable enum
Но у меня есть небольшая проблема с одним из моих классов 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