0

I'm trying to obtain the "Groups" with the users included. I'm however experiencing various Auto Mapper-related issues.

The DTO is included in the Command

The Groups has many Users but Users has only one group.

I want to try to get groups including the Users using it.

GetGroupsAsync

public class GetGroupsAsync
{
    public class GroupsAsyncQuery : IRequest<IEnumerable<GroupsAsyncQueryResult>> {}

    public class GroupsAsyncQueryResult
    {
        public Guid Id { get; set;}
        public string GroupCode { get; set;}
        public string GroupName { get; set;}
        public IReadOnlyList<GetUsersAsync.UsersAsyncQueryResult> Users { get; set;}
    }
    public class Handler : IRequestHandler<GroupsAsyncQuery, IEnumerable<GroupsAsyncQueryResult>>
    {
        private readonly IMapper _mapper;
        private readonly DataContext _dataContext;

        public Handler(IMapper mapper, DataContext dataContext)
        {
            _mapper = mapper;
            _dataContext = dataContext;
        }

        public async Task<IEnumerable<GroupsAsyncQueryResult>> Handle(GroupsAsyncQuery request,
            CancellationToken cancellationToken)
        {
            var groups = await _dataContext.Groups
                .Include(x => x.UsersCollection)
                .ToListAsync(cancellationToken);
            if (groups == null)
            {
                throw new NoGroupsFoundExceptions();
            }

            var result = _mapper.Map<IEnumerable<GroupsAsyncQueryResult>>(groups);
            return result;
        }
    }
   
}

Groups

public class Groups
{
    [Column("GroupId")]
    public Guid Id {get;set;}
    public string GroupCode {get;set;}
    public string GroupName {get;set;}
    [DataType(DataType.Date)]
    public DateTime DateAdded {get;set;} 
    public ICollection<Users> UsersCollection {get;set;}
}

Users

public class Users
{
    [Column("UserId")]
    public Guid Id {get;set;}
    public string UserCode { get; set; }
    public string FullName { get; set; }
    public string UserName { get; set;}
    public string Password { get; set; }
    public Guid GroupId { get; set; }
    public Groups Group { get; set; }
}

Mapping Profiles

public MapperProfiles()
    {
        CreateMap<Groups, GetGroupsAsync.GroupsAsyncQueryResult>()
            .ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.UsersCollection.Select(x => x.FullName)));
    }

Error

"Error mapping types.\r\n\r\nMapping types:\r\nList`1 -> IEnumerable`1\r\nSystem.Collections.Generic.List`1[[MineralWaterMonitoring.Domain.Groups, MineralWaterMonitoring, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> System.Collections.Generic.IEnumerable`1[[MineralWaterMonitoring.Features.Group.GetGroupsAsync+GroupsAsyncQueryResult, MineralWaterMonitoring, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]"

Any help we much appreciated. Thanks

I tried changing the configuration and use IReadOnlyList.

1 Answers1

0

You have misunderstood the use of ForMember, please check this link to understand how to use it correctly.

Please try modifying your code:

public MapperProfiles()
{
    CreateMap<Groups, GetGroupsAsync.GroupsAsyncQueryResult>()
        .ForMember(dest => dest.Users, opt => opt.MapFrom(src => src.UsersCollection)); 
    CreateMap<Users, UsersAsyncQueryResult>();
}

Test Result:

enter image description here

Chen
  • 4,499
  • 1
  • 2
  • 9