使用Automapper从列表中有条件地映射

时间:2015-11-03 20:50:16

标签: c# automapper

我正在尝试使用Automapper的Map函数重载来组合两个对象。一个对象来自数据库,另一个是我的应用程序视图模型。对GetUserPreferences的调用返回键值配对首选项的列表。我宁愿将我的MVC视图绑定到强类型对象,该对象在其构造函数中设置默认首选项。我认为AutoMapper可以帮助解决这个问题。我只需要组合这两个对象。

var dbPreferences = _preferenceManager.GetUserPreferences( HttpContext.User.Identity.Name, Session );            
model = Mapper.Map(dbPreferences,model);

根据我的理解,如果我正确设置了映射,我可以完成这项工作。我想要发生的是:

  • 如果源中不存在键/值对,则映射将忽略该属性并单独保留目标(目标已设置为默认值)
  • 如果源中存在键/值对(来自db的首选项),映射将使用源值并覆盖目标的默认值。

我认为这是用于条件映射的内容。但我总是得到目的地默认值。即使源有值。

我的映射如下:

Mapper.CreateMap<List<UserPreference>, UserPreferencesModel>( )
    .ForMember( dest => dest.VerticalResolution,
        opt =>
            opt.Condition(
                src =>
                    src.SingleOrDefault( p => p.PreferenceName == PreferenceManager.VERTICAL_RESOLUTION_KEY ) != null
                ) )
    .ForMember( dest => dest.GridRows,
        opt => 
            opt.Condition( 
                src =>
                    src.SingleOrDefault(p => p.PreferenceName == PreferenceManager.GRID_ROWS_KEY) != null ));

我知道我可以编写自己的方法来完成所有这些,但我觉得我已经非常接近如何使用AutoMapper。我错过了什么吗?我的src.SingleOrDefault结果永远不会用于映射到非空时。为什么呢?

0 个答案:

没有答案