EFCore Linq左外部加入

时间:2019-02-07 17:13:34

标签: c# sql-server linq entity-framework-core

我浏览了数百个示例,但仍然找不到我想要的东西。

public class CA
{
    public int Id {get;set;}
    public List<SignOff> SignOffs {get;set}
}

public class SignOff
{
    public int Id {get;set;}
    public int CAId {get;set;}
    public bool IsCurrentQtr {get;set;}
}

我目前有一个搜索功能,可以向我返回IQueryable<CA> qry。现在,我需要使用该IQueryable<CA>并在IsCurrentQtr == true处加入所有SignOffs,但是我想在SignOffs == null || SignOffs.Count == 0处选择所有CA。

它需要使用方法语法。另外,请记住,CA表中实际上有大约50列数据与其他15个FK关系,而签核表中大约有70列数据,并且它使用的是SQL Server 2017。

有人可以帮我写这个linq查询吗?

编辑1: 仅供参考,这也让我感到困惑,但这就是向我解释的方式。在试图更好地解释这一点时,我想到了一种新的陈述方式。我需要选择所有没有签名记录的CA,其中IsCurrentQtr为true。

2 个答案:

答案 0 :(得分:2)

  

我需要选择所有没有签名记录的CA,其中IsCurrentQtr为true。

然后您的查询应如下:

var caList = db.CAs.Where(ca => ca.SignOffs.All(sf => sf.IsCurrentQtr == false)).ToList();

// or

var caList = db.CAs.Where(ca => ca.SignOffs.Count(sf => sf.IsCurrentQtr) == 0).ToList();

答案 1 :(得分:0)

根据您的修改,您需要此结果。

var result = cs.Where(x => !x.Any(r => r.IsCurrentQtr));

这将在IsCurrentQtr == true的情况下查找所有没有签署记录的CA。