我对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)
仅对数据库进行一次查询很重要。
感谢。
答案 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;