关于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
为什么结果中的名称为空?
答案 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。