Проверка условий с помощью Automapper - PullRequest
0 голосов
/ 20 сентября 2019

Я использую 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.Мне нужно присвоить значения для поля IsUser в классе свойств пользователя, проверив, что условие, например, поле RoleId в Persons равно 2.

Как проверить условие с помощью автоматического средства?

Версия Automapper: 9.0.0

1 Ответ

1 голос
/ 20 сентября 2019

Вам нужно добавить условие ForMember в ваше отображение, чтобы добавить условие - вот рабочий пример (который занял больше времени, чем следовало бы, потому что вы разместили изображение своего кода вместо реального кода. Вот почемуна ТАК вы всегда должны отправлять код, а не изображения.)

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; }
}

Вывод:

FalseTrue

Однако

Код конфигурации сопоставления не должен «знать», что RoleID указывает на пользователя.Ваш класс Person должен находиться там, где хранятся эти знания, поэтому он должен иметь либо метод IsUser(), либо свойство IsUser только для получения (с атрибутом NotMapped), которое возвращает RoleId == 2: в первом случаевам все равно понадобится ForMember, но в последнем случае вы этого не сделаете, хотя, если вы делаете отображаете обратно с UserProperties на Persons, вам нужно что-то там, чтобы справиться с этим - опять же, это должнобыть в классе Persons, а не в конфигурации маппера.Может быть SetAsUser(), который устанавливает RoleId.

...