选择具有相同外键的项目

时间:2020-03-20 17:29:29

标签: c# sql linq

我对C#中的Linq有疑问。

假设我有3个表“ Company”,“ Employee”和“ Job”。

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

类似的东西: enter image description here

重要的是,每个work必须连接到company,但不一定必须连接到员工。但是,每个employee必须连接到company。例如,我们可以拥有这样的赛车:

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。 因此,在这种情况下,应该是ID为1和2的工作,因为员工1被分配给了公司1,ID为2的工作也被分配给了该公司。我如何使用linq做到这一点,但类似这样: _context.Job.Where (x => x)

仅对数据库进行一次查询很重要。

感谢。

1 个答案:

答案 0 :(得分:0)

您可以通过两步思考来简化问题:找到给定员工的公司,找到该公司的所有工作:

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转换为SQL中的EXISTS查询。

请注意,由于您知道companyToFind应该只有一个答案,因此向数据库发送两个查询可能会更有效。

对于LINQ to 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;
相关问题