linq (лямбда) для запроса, который соединяется со многими ко многим с таблицей соединений, которая не является сущностью - PullRequest
0 голосов
/ 02 июня 2019

Я пытаюсь получить список устройств, которые были зарегистрированы для пользователей на основе определенного проекта.

Моя схема выглядит следующим образом:

У меня есть отношения многие ко многиммежду моей таблицей «Пользователи» и «Проекты», и это делается таблицей соединений под названием 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...