我在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
}
}
在接下来的步骤中,我将与其余实体保持相同,但请给我一些提示:)
我想您在[]中将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);