c# - 选择具有相同外键的项目
问题描述
我对 C# 中的 Linq 有疑问。
假设我有 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
。所以在这种情况下,它应该是 ID 为 1 和 2 的工作,因为员工 1 被分配给公司 1,而 ID 为 2 的工作也被分配给这家公司。我怎么能使用 linq 来实现这一点,但像这样:
_context.Job.Where (x => x)
只对数据库进行一次查询很重要。
坎克斯。
解决方案
您可以通过分两步考虑问题来简化问题:找到给定员工的公司,找到该公司的所有工作:
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.xAny
被转换为EXISTS
SQL 中的查询。
请注意,由于您知道 应该只有一个答案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;
推荐阅读
- rspec-rails - Mysql2::Error: MySQL 客户端未连接
- google-cloud-platform - Google Cloud Platform:项目出现在结算报告中,但未显示在项目列表中
- javascript - 从 JS 类中获取字段(属性)初始值
- c++ - 修剪 istream 的结尾
- python - 如何在 Tkinter 中使标签背景透明?
- arrays - where子句包含数组列时如何选择匹配的记录?
- reactjs - React onClick 不适用于列表项
- ios - 使用图表绘制动态数据的推荐方式是什么
- c - 为什么在结构中声明结构不起作用?
- powershell - Powershell 调用命令