ConstructProjectionUsing - 我做错了什么?

时间:2016-04-27 18:41:24

标签: .net automapper

关于AutoMapper的问题。 我正在尝试使用构造表达式将IQueryable投影到DTO,但结果在其字段中始终为null。

    public class BaseObject { }
    public class DTO { public string Name { get; set; } }

....

            // create map BaseObject-to-DTO
            Mapper.CreateMap<BaseObject, DTO>()
                .ConstructProjectionUsing(s => new DTO
                {
                    Name = "This name will never appear in DTO"
                });

            // create object array with one element
            var objects = new [] { new BaseObject() };

            var result = objects.AsQueryable().ProjectTo<DTO>(); // here Name = null everywhere

为什么结果中的名称为空?

2 个答案:

答案 0 :(得分:1)

这是预期的行为。 AutoMapper正试图构建一个&#34; Select&#34;投影。没有AutoMapper的普通源/目标投影在LINQ中看起来像这样:

objects.AsQueryable().Select(bo => new DTO { Name = bo.Name });

我浏览了源/目标成员,并在LINQ中构建了所谓的MemberInitExpression。这是构造表达式加上成员初始化,新的+大括号属性赋值。

ConstructProjectionUsing是关于更换&#34; new&#34;成员init表达式的一部分:bo => new DTO("I like turtles") { Name = bo.Name };而不是单个成员。对于您正在寻找的内容,我实际上必须合并两个成员初始化表达式 - 一个AutoMapper根据源/目标属性构建的表达式,以及您放置的任何内容在配置中。我的头脑在考虑如何有效地做到这一点。

如果您尝试不这样做,或者至少有更好的IntelliSense注释,我可能会抛出配置异常。随意为此开一个GH问题!

答案 1 :(得分:0)

我猜,

ConstructProjectionUsing只接受构造函数。它适用于:

.ConstructProjectionUsing(s => new DTO("This name will never appear in DTO"))

回答问题“为什么”深入自动映射sources