Соотношение ManyToMany - загрузка данных в формате JSON - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть связь ManyToMany между таблицами:

  • Пользователь
  • Tag

(все сделано согласно рекомендациям)

public IEnumerable<User> GetAll()
{
    return _context.Users
        .Include(x => x.UserTags)
            .ThenInclude(z => z.Tag);
}

Приложение очень глубокое

[
    {
        "id": 1,
        "username": "Jon",
        "password": null,
        "userTags": [
            {
                "userId": 1,
                "user": {
                 ...

Я хотел бы получить:

[
    {
        "id": 1,
        "username": "Bartek",
        "password": null,
        "userTags": [ // List of Tags ]

ИЗД.

На данный момент я сделал, как показано ниже

[HttpGet]
public IActionResult GetAll()
{
    var users = _userService.GetAll();

    List<UserDto> result = new List<UserDto>();

    foreach (var user in users)
    {
        var tagDto = _mapper.Map<IList<TagDto>>(user.UserTags.Select(x => x.Tag));

        var userDtos = new UserDto
        {
            Id = user.Id,
            Username = user.Username,
            Tags = tagDto
        };
        result.Add(userDtos);
    }

    return Ok(result);
}

Но нет ли встроенной опции для получения желаемого эффекта?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Просто мысль, предполагая, что «все сделано согласно рекомендациям»

public IEnumerable<User> GetAll()
{
    return _context.Users
        .Include(x => x.UserTags)
            .ThenInclude(z => z.Tag);
}

эти данные указывают на

[
    {
        "id": 1,
        "username": "Bartek",
        "password": null,
        "userTags": [ // List of Tags ]

что вы должны изменить на это

public IEnumerable<User> GetAll()
{
    return _context.Users
        .Include(a => a.UserTags.Tags.Select(c => c.tagname));
}
0 голосов
/ 12 сентября 2018

Я построил свой собственный Mapper для этой ситуации:

public class MyMapper
{
    public IList<UserDto> GetUserDto(IEnumerable<User> users, IMapper _mapper)
    {
        List<UserDto> result = new List<UserDto>();

        foreach (var user in users)
        {
            var tagDto = _mapper.Map<IList<TagDto>>(user.UserTags.Select(x => x.Tag));

            var userDtos = new UserDto
            {
                Id = user.Id,
                Username = user.Username,
                Tags = tagDto
            };
            result.Add(userDtos);
        }

        return result;
    }
}

Использование: (Контроллер)

private IMapper _mapper;
private MyMapper _myMapper;

public UsersController(IMapper mapper)
{
    _mapper = mapper;
    _curioMapper = new CurioMapper();
}

[HttpGet]
public IActionResult GetAll()
{
    var users = _userService.GetAll();
    var result = _myMapper.GetUserDto(users, _mapper);

    return Ok(result);
}
...