2017-06-04 125 views
13
public class Foo 
{ 
    public string Baz { get; set; } 
    public List<Bar> Bars { get; set; } 
} 

当我映射上面的类时,有没有什么办法来定义我想让automapper映射对象的深度?一些伪代码我之后:AutoMapper定义映射级别

var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 0 }); 
// result = { Baz: "" } 

var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 1 }); 
// result = { Baz: "", Bars: [{ Blah: "" }] } 

var mapped = Mapper.Map<FooDTO>(foo, opt => { levels: 2 }); 
// result = { Baz: "", Bars: [{ Blah: "", Buzz: [{ Baz: "" }] }] } 

// etc... 

我目前使用automapper 3.3由于nuget依赖。

+0

即使在最新版本中,也无法在automapper中设置关卡。因为您一次只处理1级层次结构。在你的情况下,你需要2个映射器配置。一个用于'Foo',另一个用于'Bar'。你可以在你的映射器配置中使用'opt.Ignore()'作为你不想映射的属性。如果对象的名称相同或匹配,Automapper会自动映射。我认为在你的情况下,对象名称是不同的,你需要为每个对象进行配置。 – Venky

回答

7

您可以通过在运行时提供值来解决问题:How to ignore a property based on a runtime condition?

配置:

Mapper.CreateMap<Foo, FooDTO>().ForMember(e => e.Bars, 
    o => o.Condition(c => !c.Options.Items.ContainsKey("IgnoreBars"))); 

用法:你可以申请您致电级别所有的嵌套对象

Mapper.Map<FooDTO>(foo, opts => { opts.Items["IgnoreBars"] = true; }); 

相同的配置方法。

如果您想为您的数据库实体实现相同的行为,可以使用ExplicitExpansion方法,如本答案中所述:Is it possible to tell automapper to ignore mapping at runtime?

配置:

Mapper.CreateMap<Foo, FooDTO>() 
    .ForMember(e => e.Bars, o => o.ExplicitExpansion()); 

用法:

dbContext.Foos.Project().To<FooDTO>(membersToExpand: d => d.Bars);