Automapper 通过 Entity Framework 中的关系

Automapper through relations in Entity Framework

作为 automapper (v10.0.0) 的新手,我正在尝试替换我的一个查询。我目前使用它来生成我的回复:

var query = from a in _context.ApprovalStatuses.AsNoTracking()
                .Include(x => x.ApprovalOrder).ThenInclude(x => x.Worker)
            where a.RequestId == request.Id
            orderby a.ApprovalOrder.Position
            let w = a.ApprovalOrder.Worker
            select new RequestApprovalStatusDTO {
                AssignedUtc = a.AssignedUtc,
                Comments = a.Comments,
                DecisionDateUtc = a.ApprovedDateUtc ?? a.RejectedDateUtc,
                Email = w.Email,
                Name = w.Name,
                Uuid = a.Uuid
            };

所以我开始在我的 Profile 子类中创建映射:

CreateMap<ApprovalStatus, RequestApprovalStatusDTO>()
    .ForMember(x => x.DecisionDateUtc, x => x.MapFrom(y => y.ApprovedDateUtc ?? y.RejectedDateUtc))
    .ForMember(x => x.Email, x => x.MapFrom(y => y.ApprovalOrder.Worker.Email))
    .ForMember(x => x.Name, x => x.MapFrom(y => y.ApprovalOrder.Worker.Name));

然后我像这样重写了查询:

var query = _context.ApprovalStatuses
    .Include(x => x.ApprovalOrder)
    .ThenInclude(x => x.Worker)
    .Where(x => x.RequestId == request.Id)
    .OrderBy(x => x.ApprovalOrder.Position);

return Ok(_mapper.Map<RequestApprovalStatusDTO>(query));

在运行时,它告诉我

AutoMapperMappingException: Missing type map configuration or unsupported mapping.

Mapping types: Object -> RequestApprovalStatusDTO
System.Object -> BoltOn.RequestApprovalStatusDTO
lambda_method(Closure , object , RequestApprovalStatusDTO , ResolutionContext )

我知道它告诉我它不知道如何从 object 转换,但我不确定它为什么要这样做,因为 query 是一个 IOrderedQueryable<ApprovalStatus>.

感谢 Lucian 的指点,我可以这样解决:

var query = _context.ApprovalStatuses
    .Where(x => x.Request.Uuid == uuid)
    .OrderBy(x => x.ApprovalOrder.Position);

var approvals = await _mapper.ProjectTo<RequestApprovalStatusDTO>(query).ToArrayAsync();
if (approvals.Length == 0)
    return NotFound();

return Ok(approvals);