通过使用表达式映射将AutoMapper未映射的属性

时间:2019-10-16 12:23:04

标签: c# expression automapper iqueryable

我尝试使用表达式映射将业务对象映射到持久性对象。

我能够将问题简化为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上,说明了问题所在。

0 个答案:

没有答案