Я пытаюсь отобразить бизнес-объекты на персистентные объекты с помощью сопоставления выражений.
Мне удалось упростить задачу до этого простого использования AutoMapper.
Классы для сопоставления:
public class X
{
public X(string name) => this.Name = name;
public string Name { get; }
}
public class Y
{
public string Name { get; set; }
}
Эти классы очень просты, но показывают проблему. Х неизменен. Это не проблема для AutoMapper. Я создал карту наподобие
var mapperConfig = new MapperConfiguration(
cfg =>
{
cfg.CreateMap<X, Y>().ReverseMap();
});
var mapper = mapperConfig.CreateMapper();
. В этом случае все работает как положено:
var yInstances = new List<Y> { new Y { Name = "Foo" } }; // Just to have some instances.
var xInstances = yInstances.Select(mapper.Map<X>).ToList();
Как и ожидалось, я получил список X
-Instances.
Но я попытался использовать его как IQueryable<T>
, используя сопоставление выражений:
Expression<Func<X, bool>> filter = item => item.Name == "Foo";
// this line thows exception
yInstances.AsQueryable().Where(mapper.MapExpression<Expression<Func<Y, bool>>>(filter)).ToList();
В последней строке выдается исключение, содержащее это сообщение:
Unhandled exception. AutoMapper.AutoMapperConfigurationException:
Unmapped members were found. Review the types and members below.
Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type
For no matching constructor, add a no-arg ctor, add optional arguments, or map all of the constructor parameters
=======
Y -> X (None member list)
Y -> X (None member list)
Unmapped properties:
Name
Не существует несопоставленного свойства, поскольку mapper.Map<X>
работает.
Я пытался добавить .ForCtorParam("name", opt => opt.MapFrom(src => src.Name))
. Но это не работает - не удивительно.
Что я делаю не так? Я уверен, что это только один шаг, но я не могу его найти. Извините.
Код на .Net Fiddle , который иллюстрирует проблему.