首页 > 解决方案 > 选择具有相同外键的项目

问题描述

我对 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)

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

坎克斯。

标签: c#sqllinq

解决方案


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

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

请注意,由于您知道 应该只有一个答案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;

推荐阅读