如何使用ICollection和IList为实体和DTO创建Map

问题描述 投票:0回答:1

我在AutoMapper中映射时遇到问题。我尝试使用ForMember函数,但是在连接映射时仍然出现错误。如何为此实体创建地图?

上下文中的DbSet:

    public virtual DbSet<Event> Event { get; set; }
    public virtual DbSet<EventGroup> EventGroup { get; set; }
    public virtual DbSet<Group> Group { get; set; }

实体:

    public partial class Member
    {
        public Member()
        {
            GroupMember = new HashSet<GroupMember>();
            MemberRank = new HashSet<MemberRank>();
            Participation = new HashSet<Participation>();
        }

        public int MemberId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public string PhoneNumber { get; set; }
        public DateTime? DateOfBirth { get; set; }
        public DateTime CreatedDate { get; set; }
        public DateTime UpdatedDate { get; set; }
        public bool IsActive { get; set; }

        public virtual ICollection<GroupMember> GroupMember { get; set; }
        public virtual ICollection<MemberRank> MemberRank { get; set; }
        public virtual ICollection<Participation> Participation { get; set; }
    }

    public partial class Group
    {
        public Group()
        {
            EventGroup = new HashSet<EventGroup>();
            GroupMember = new HashSet<GroupMember>();
        }

        public int GroupId { get; set; }
        public string Name { get; set; }
        public DateTime CreatedDate { get; set; }
        public DateTime UpdatedDate { get; set; }
        public DateTime? DeletedDate { get; set; }
        public bool IsActive { get; set; }

        public virtual ICollection<EventGroup> EventGroup { get; set; }
        public virtual ICollection<GroupMember> GroupMember { get; set; }
    }

    public partial class GroupMember
    {
        public int GroupMemberId { get; set; }
        public int GroupId { get; set; }
        public int MemberId { get; set; }

        public virtual Group Group { get; set; }
        public virtual Member Member { get; set; }
    }

DTO:

    public class MemberDto
    {
        public int MemberId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public string PhoneNumber { get; set; }
        public DateTime? DateOfBirth { get; set; }
        public DateTime CreatedDate { get; set; }
        public DateTime UpdatedDate { get; set; }
        public bool IsActive { get; set; }

        public IList<GroupDto> Groups { get; set; }
        //public IList<EventDto> Events { get; set; }
    }

    public class GroupDto
    {
        public int GroupId { get; set; }
        public string Name { get; set; }
        public DateTime CreatedDate { get; set; }
        public DateTime UpdatedDate { get; set; }
        public DateTime? DeletedDate { get; set; }
        public bool IsActive { get; set; }

        public List<MemberDto> Members { get; set; }

    }

我创建了一个自动映射类:

    public class AutoMapping : Profile
    {
        public AutoMapping()
        {
            CreateMap<Member, MemberDto>()
                .ForMember(dest => dest.Groups, opt => { opt.MapFrom(src => src.GroupMember.Select(x => x.Group)); });
            CreateMap<Group, GroupDto>()
                .ForMember(dest => dest.Members, opt => { opt.MapFrom(src => src.GroupMember.Select(x => x.Member)); });
        }
    }

而且我尝试这样使用它:

    public async Task<Page<MemberDto>> GetPaginatedAsync(IDataTablesRequest request)
    {
        Filters<MemberDto> filters = GetFiltersFromRequest(request);
        Sorts<MemberDto> sorts = GetSortsFromRequest(request);
        var currentPage = request.Start / request.Length + 1;
        var pageSize = request.Length;

        try
        {
            return await _context.Member
                .Include(gm => gm.GroupMember)
                .ThenInclude(g => g.Group)
                .Select(m => _mapper.Map<MemberDto>(m))
                .PaginateAsync(currentPage, pageSize, sorts, filters);
        }
        catch (Exception ex)
        {
            throw ex; //Log it
        }
    }

在接下来的步骤中,我将与其余实体保持相同,但请给我一些提示:)

c# asp.net entity-framework asp.net-core automapper
1个回答
0
投票

我想您在[]中将LINQ转换为SQL时遇到了错误>

.Select(m => _mapper.Map<MemberDto>(m))

显然,_mapper.Map<MemberDto>(m)无法转换为SQL,因此,您可以尝试使用.ProjectTo<MemberDto>()(请参见QuarableExtensions)来代替该行,以便查询看起来像]

return await _contesnxt.Member
            .Include(gm => gm.GroupMember)
            .ThenInclude(g => g.Group)
            .ProjectTo<MemberDto>()     
            .PaginateAsync(currentPage, pageSize, sorts, filters);
© www.soinside.com 2019 - 2024. All rights reserved.