Выберите элементы с одинаковым внешним ключом - PullRequest
0 голосов
/ 20 марта 2020

У меня есть вопрос относительно Linq в C#.

Допустим, у меня есть 3 таблицы «Компания», «Сотрудник» и «Работа».

Company
--------
Id - int (PK)
Name - string
Employee
--------
Id - int (PK)
CompanyId - int (FK on Company.Id)
Name - string
Job
--------
Id - int (PK)
CompanyId - int (FK on Company.Id)
EmployeeId - int (FK on Employee.Id)
Name - string

Примерно так: введите описание изображения здесь

Важно то, что каждый work должен быть подключен к company но не обязательно для работника. Однако каждый employee должен быть подключен к company. Например, у нас может быть такой racord:

Company
--------
Id     Name
1      'A'
2      'B'
3      'C'
Employee
--------
Id     CompanyId     Name
1          1         'A'
2          1         'B'
3          2         'C'
Job
--------
Id     CompanyId     EmployeeId     Name
1          1             1         'clean'
2          1             2         'wash'
3          2             2         'buy'
4          3            NULL       'sell'

А теперь с linq я хотел бы получить все jobs, назначенные этому employee и другим сотрудникам из то же самое company. Таким образом, в этом случае это должны быть задания с идентификатором 1 и 2, поскольку сотрудник 1 назначен компании 1, а задание с идентификатором 2 также назначено этой компании. Как я могу добиться этого с помощью linq, но что-то вроде этого: _context.Job.Where (x => x)

Важно сделать только один запрос к базе данных.

Tkanks.

1 Ответ

0 голосов
/ 20 марта 2020

Вы можете упростить проблему, подумав об этом в два этапа: найти компанию для данного сотрудника, найти все вакансии для этой компании:

var companyToFind = from e in Employee
                     where e.Id == empToFind
                     select e.CompanyId;

var jobsToFind = from j in Job
                 where companyToFind.Any(cid => cid == j.CompanyId)
                 select j;

В LINQ to SQL, EF Core 2.2 и EF Core 3.x Any преобразуется в запрос EXISTS в SQL.

Обратите внимание, поскольку вы знаете, что на companyToFind должен быть только один ответ, отправляя два запроса на база данных может быть более эффективной.

Для LINQ до SQL или EF Core 3.x вы также можете вкладывать первый запрос и сводить его к одному результату:

var jobsToFind = from j in Job
                 where (from e in Employee
                     where e.Id == empToFind
                     select e.CompanyId).First() == j.CompanyId
                 select j;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...