【问题标题】:EFCore Linq Left Outer JoinEFCore Linq 左外连接
【发布时间】:2019-02-07 17:13:33
【问题描述】:

我已经浏览了数百个示例,但仍然无法找到我要查找的内容。

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&lt;CA&gt; qry。我现在需要使用 IQueryable&lt;CA&gt; 并离开加入 IsCurrentQtr == true 的所有 SignOffs 但我想选择 SignOffs == null || SignOffs.Count == 0 的所有 CA。

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

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

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

【问题讨论】:

  • now need to use that IQueryable&lt;CA&gt; and left join all SignOffs where IsCurrentQtr == true but then I want to select all CA where SignOffs == null || SignOffs.Count == 0. 你的要求让我很困惑!你能进一步解释一下吗?
  • @TanvirArjel - 我对问题的编辑有帮助吗?
  • EF Core 假设让你的生活更轻松,如果它相反 - EF 提供运行普通 sql 查询的可能性;)
  • @Ben 请让我明白一件事。假设一个 CA 有两个 SignOffs,其中一个 SignOffs 是 IsCurrentQtr == true,另一个是 false,那么这个 CA 会被忽略吗?
  • @TanvirArjel - 在这种情况下,我不希望 CA 返回,因为它具有 CurrentQtr SignOff。我只想要没有 currentQtr 签核的 CA。

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


【解决方案1】:

我需要选择所有没有 IsCurrentQtr 为 true 的签核记录的 CA。

那么你的查询应该如下:

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();

【讨论】:

  • 我花了一段时间才确认您的答案是正确的,因为有些代码采用了完全不同的路线来获得相同的答案。他们的答案是返回 46 个结果,而我被告知这是正确的,而您的答案是返回 55 个结果。好吧,我现在可以正式证明你的答案是正确的,其他人是错误的。在我使用 GroupJoin 发布这个问题之前,我实际上有正确的答案,但由于结果的数量,我认为这是错误的。感谢大家的回复!
  • 很高兴听到这个消息。欢迎:)
【解决方案2】:

根据您的编辑,您想要这个结果。

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

这将找到所有没有 IsCurrentQtr == true 的签核记录的 CA。

【讨论】:

    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2011-08-04
    • 2011-03-25
    相关资源
    最近更新 更多