用于内部连接 ​​LINQ 的自动映射器

Automapper for inner join LINQ

目前,我已经成功使用Automapper将我的大厅实体映射到Dto,如下所示:

    [HttpGet]
    public async Task<ActionResult<IEnumerable<HallDto>>> GetHallDto()
    {
        return await _context.Halls
            .ProjectTo<HallDto>(_mapper.ConfigurationProvider)
            .ToListAsync();
    }

但是对于下面的另一个网络 api 方法,当我有内部连接 ​​LINQ 时如何使用 Automapper?目前,这是我手动映射它们的方式。

    [HttpGet]
    public async Task<ActionResult<IEnumerable<MovieHallDto>>> GetMovieHallDto()
    {
        var movieHallListDto = await (from mh in _context.MovieHalls
                             join m in _context.Movies on mh.MovieId equals m.Id
                             join h in _context.Halls on mh.HallId equals h.Id
                             select new MovieHallDto
                             {
                                 Id = mh.Id,
                                 MovieTitle = m.MovieTitle,
                                 HallNo = h.HallNo,
                                 MovieDateTime = mh.MovieDateTime
                             }).ToListAsync();

        return movieHallListDto;
    }

这是我的 AutoMapperProfile

public class AutoMapperProfile : Profile
{
    public AutoMapperProfile()
    {
        CreateMap<Movie, MovieDto>();
        CreateMap<Hall, HallDto>();
        CreateMap<MovieHall, MovieHallDto>();
    }
}

从数据库中获取数据需要多少次连接并不重要。很容易映射所需的属性,如下所示。

就您而言,我想您想知道如何映射 List。您应该正确配置映射器,如下所示。

 CreateMap<MovieHallDto, MovieHall>(); //<Source, Destination>
// MovieHall class should have Id , MovieTitle ,HallNo , MovieDateTime  properties

修改 API 的输出。

[HttpGet]
    public async Task<ActionResult<IEnumerable<MovieHall>>> GetMovieHallDto()
    {
        var movieHallListDto = await (from mh in _context.MovieHalls
                             join m in _context.Movies on mh.MovieId equals m.Id
                             join h in _context.Halls on mh.HallId equals h.Id
                             select new MovieHallDto
                             {
                                 Id = mh.Id,
                                 MovieTitle = m.MovieTitle,
                                 HallNo = h.HallNo,
                                 MovieDateTime = mh.MovieDateTime
                             }).ToListAsync();

var model = Mapper.Map<List<MovieHall>>(movieHallListDto );

return Ok(model );

    }

如果您的表具有适当的参照完整性,您可以像下面这样使用。

[HttpGet]
public async Task<ActionResult<IEnumerable<MovieHall>>> GetMovieHallDto()
{

    var movieHalls  = _context.MovieHalls.Include(c => c.Movies).ThenInclude(c => c.Halls).ToListAsync();

    var model = Mapper.Map<List<MovieHall>>(movieHalls);

    return Ok(model);

}
CreateMap<MovieHallDto, MovieHall>(MemberList.None)
    .ForMember(d => d.Id , s => s.MapFrom(des => des.Id))
.ForMember(d => d.MovieTitle , s => s.MapFrom(des => des.Movies.MovieTitle))
.ForMember(d => d.HallNo  , s => s.MapFrom(des => des.Halls.HallNo))
.ForMember(d => d.MovieDateTime  , s => s.MapFrom(des => des.MovieDateTime));
public YourController(ILogger<YourController> logger,             
             IMapper mapper)
        {
            Logger = logger;            
            Mapper = mapper;            
        }

        public ILogger<YourController> Logger { get; }

        public IMapper Mapper { get; }

看看这是否有助于解决您的问题。如果您仍有问题,请提供实体详细信息。