我尝试使用表达式映射将业务对象映射到持久性对象。
我能够将问题简化为AutoMapper的这种简单用法。
要映射的类:
public class X
{
public X(string name) => this.Name = name;
public string Name { get; }
}
public class Y
{
public string Name { get; set; }
}
这些类非常简单,但显示出了问题。 X是不可变的。对于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
个实例的列表。
但是我尝试通过表达式映射将其用作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上,说明了问题所在。