用于内部连接 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; }
看看这是否有助于解决您的问题。如果您仍有问题,请提供实体详细信息。
目前,我已经成功使用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; }
看看这是否有助于解决您的问题。如果您仍有问题,请提供实体详细信息。