Цепочка ссылок ASP.NET Core EF - PullRequest
0 голосов
/ 06 октября 2019


У меня есть проект ASP.NET Web API.
База данных: PostgreSQL
У меня есть 2 объекта - Пользователь и Группа. Это отношение многих ко многим, таким образом, существует 3 класса - User, Group и UserGroup. Проблема возникает, когда я хочу получить все группы, в которых находится пользователь - цикл ссылок. Мне просто нужны группы, а не пользователи в них. Я не уверен, как этого добиться, сейчас я просто использую это:

var user = await _context.Users.Include(u => u.UserGroups).ThenInclude(ug => ug.Group)
                .FirstOrDefaultAsync(u => u.Email == email.ToLower());
            var userGroups = user.UserGroups.Select(ug =>
            {
                var group = ug.Group;
                group.UserGroups = null;
                return group;
            }).ToArray();

Чтобы было ясно, моя проблема не в ошибке JSON, я просто не хочу, чтобы эти объектыбыть включенным.
Я думал, что выбор отдельных столбцов в базе данных может помочь, но я не думаю, что это хороший подход, так как вам придется менять его каждый раз, когда вы меняете объекты.
EDIT1
Мне нужно вывести пользователя с массивом его групп.
EDIT2
Вывод кода, показанного выше, таков:

{
  "id": "7e445bd2-4257-40ad-bed1-be975e562fa0",
  "registeredAt": "2019-10-06T16:51:39.235955",
  "email": "kozak.vaclav@kobrasoft.cz",
  "firstName": "Vaclav",
  "lastName": "Kozak",
  "locale": "cs-CZ",
  "groups": [
    {
      "id": "7e445bd2-4257-40ad-bed1-be975e562fa0",
      "groupType": 0,
      "userGroups": null
    }
  ]
}

, и это именно то, чего я хочу, но я просто ищу более разумное решение, чем мое.

1 Ответ

0 голосов
/ 06 октября 2019

Другим способом является поиск в таблице ассоциаций и выбор необходимых групп. Ленивая загрузка не используется.

var userGroups = await _context.UserGroup
.Include(x => x.User)
.Include(x => x.Group)
.AsNoTracking()
.Where(x => x.User.Email.ToLower() == e)
.Select(x => x.Group)
.ToListAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...