Я пытаюсь получить список устройств, которые были зарегистрированы для пользователей на основе определенного проекта.
Моя схема выглядит следующим образом:
У меня есть отношения многие ко многиммежду моей таблицей «Пользователи» и «Проекты», и это делается таблицей соединений под названием ProjectUsers.Моя таблица устройств присоединяется к пользователям с помощью поля UserId.
Мне нужно, чтобы мой список устройств был возвращен на основе идентификатора проекта, но мне трудно использовать Join<>
, потому что моя сущность ProjectUsers не 'не существует в моем контексте.
В конечном итоге это запрос, который мне нужен, и когда я запускаю его в SSMS, я получаю нужные результаты:
select d.* from devices d
join users u on u.id = d.userid
join projectusers pu on pu.userid = u.id
join projects p on p.id = pu.projectid
where p.id = 7
Вот мои модели, если это поможет: Пользователи:
public class User : IInt32Identity
{
public int Id { get; set; }
public string UserEmail { get; set; }
public List<ProjectUsers> ProjectUsers { get; set; }
...
}
Проекты:
public class Project : IInt32Identity
{
public int Id { get; set; }
public string ProjectName { get; set; }
public List<ProjectUsers> ProjectUsers { get; set; }
...
}
ProjectUsers:
public class ProjectUsers
{
public int UserId { get; set; }
public User User { get; set; }
public int ProjectId { get; set; }
public Project Project { get; set; }
}
Устройства:
public class Device : IInt32Identity
{
public int Id { get; set; }
public string Name { get; set; }
public int UserId { get; set; }
...
}
РЕДАКТИРОВАТЬ: Добавление кода, которыйработает как два разных выражения.Когда я объединяю их в одно выражение (заменяю мой «временный» объект users во втором выражении полным первым выражением), это не работает.
List<User> users = _context.Users
.Include(x => x.ProjectUsers)
.ThenInclude(b => b.Project)
.Where(x => x.ProjectUsers
.Any(y => y.ProjectId == id))
.ToList();
List<Device> devices = _context.Devices
.Where(x => users
.Any(l => x.UserId == l.Id))
.ToList();
return devices;