EF.Core加载所有在其他表中没有相关记录的记录

时间:2016-11-29 09:16:25

标签: c# sql-server entity-framework

是否可以在Entity Framework Core(或7)中加载表中没有相关记录的所有记录?

在我的情况下,我有一个Customers表和一个Contracts表。客户可以拥有0到N个合同。在这个特定用例中,我想查询所有没有合同的客户。

**Customer Table:**

CustomerId | Name
---------- | ----------
1          | Apple
2          | Google
3          | Microsoft

**Contracts Table:**

| ContractId | CustomerId | StartDate  | EndDate    |
| ---------: | ---------: | ---------- | ---------- |
| 1          | 2          | 01-01-2016 | 01-01-2018 |
| 2          | 3          | 01-01-2016 | 01-01-2018 |

在这种情况下,我希望查询只返回一个包含Apple客户的对象。

在SQL中我会做这样的事情:

select cust.CustomerId, cust.Name
  from dbo.Customers as cust
    left outer join dbo.Contracts as contr
      on cust.CustomerId = contr.CustomerId
  where contr.ContractId is null;

如何将其转换为EF查询?

2 个答案:

答案 0 :(得分:2)

你只需要一个linq查询来实现你想要的东西(独立于EF版本):

var result = yourContext
    .Customers
    .Where(x => !yourContext.Contracts.Any(y => x.Id == y.CustomerId));

当然,我认为在您的客户实体CustomerId中称为Id

答案 1 :(得分:0)

List<Contracts>课程中添加属性Customer,您可以通过以下查询获得没有合同的客户:

var customersWithZeroContract = db.Customers.Where(c => c.Contracts.Count()  == 0);