使用Automapper检查条件

时间:2019-09-20 10:03:36

标签: c# lambda automapper

我正在使用Automapper。这样,我将DTO与数据库表进行了映射。在那一种情况下,我需要检查一种情况,然后取值。

CreatedBy = mapper.Map<UserProperties>((from createdByUser in context.persons.Where(x => x.IsActive && x.Id == notes.CreatedBy) select createdByUser).FirstOrDefault())

这是我的代码。

用户属性类:

public string DisplayName { get; set; }

public int Id { get; set; }

public bool IsUser { get; set; }

public int NotesCount {get;set;}

public string DisplayName { get; set; }

public int Id { get; set; }

public int RoleId{ get; set; }

public int NotesCount {get;set;}

public string Notes{get;set;}

public string Comments {get;set;}

下面的代码是启动文件中的自动映射器配置。

enter image description here

映射配置文件类

enter image description here

在人员中,具有字段roleId。我需要通过检查Persons中的IsUser字段等条件等于2,来为User属性类中的RoleId字段分配值。

如何使用自动映射器检查条件?

自动映射器版本:9.0.0

1 个答案:

答案 0 :(得分:1)

您需要在映射中添加一个ForMember子句以添加条件-这是一个有效的示例(此示例花费了比原先更长的时间,因为您发布的是代码的图片而不是实际的代码。这就是为什么在SO上应该始终发布代码而不是图片的原因。)

void Main()
{
    var mapperConfig = 
          new MapperConfiguration(mc => mc.AddProfile<MappingProfile>());

    var mapper = mapperConfig.CreateMapper();
    var notAUser = new Persons { RoleId = 1};
    var isAUser = new Persons { RoleId = 2};

    var shouldBeNotAUser = mapper.Map<UserProperties>(notAUser);
    var shouldBeAUser = mapper.Map<UserProperties>(isAUser);

    Console.WriteLine(shouldBeNotAUser.IsUser);
    Console.WriteLine(shouldBeAUser.IsUser);

}

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<Persons, UserProperties>()
        .ForMember(destination => destination.IsUser, 
                     options => options.MapFrom(src => src.RoleId == 2));
    }
}

class UserProperties
{
    public string DisplayName { get; set; }
    public int Id { get; set; }
    public bool IsUser { get; set; }
    public int NotesCount { get; set; }
}

class Persons
{
    public string DisplayName { get; set; }
    public int Id { get; set; }
    public int RoleId { get; set; }
    public int NotesCount { get; set; }
    public string Notes { get; set; }
    public string Comments { get; set; }
}

输出:

  

错误
  是

但是

您的映射配置代码不必“知道”什么RoleID指示用户。您的Person类应该是掌握该知识的位置,因此应该具有IsUser()方法或仅获取的IsUser属性(带有NotMapped属性),该属性返回RoleId == 2:在前一种情况下,您仍然需要ForMember,但在后一种情况下则不需要,尽管如果您 do UserProperties映射回{ {1}}您将需要一些东西来处理它-再次,它应该在Persons类中,而不是在mapper配置中。也许Persons设置了RoleId。