C# 无法构造正确的查询WHERE子句-组合键、多个表、完整数据

C# 无法构造正确的查询WHERE子句-组合键、多个表、完整数据,c#,model-view-controller,C#,Model View Controller,我们有一个相当冗长的查询,无法让它“正确”工作。 查询和要求如下所示 如果这个问题的标题没有多大帮助,请道歉。我们不知道还能叫什么名字 当前代码: from process in _db.Process join job in _db.Job on new { Company_ID = process.Company_ID, Job_ID = process.Job_ID } equals new { Company_ID = job.Company_ID, Job_ID = job.ID

我们有一个相当冗长的查询,无法让它“正确”工作。 查询和要求如下所示

如果这个问题的标题没有多大帮助,请道歉。我们不知道还能叫什么名字

当前代码:

from process in _db.Process
  join job in _db.Job on new { Company_ID = process.Company_ID, Job_ID = process.Job_ID } equals new { Company_ID = job.Company_ID, Job_ID = job.ID } into j
  from subjob in j.DefaultIfEmpty()
  join pp in _db.Process on new { Company_ID = process.Company_ID, ParentProcess_ID = process.ParentProcess_ID } equals new { Company_ID = pp.Company_ID, ParentProcess_ID = pp.ID } into p
  from subprocess in p.DefaultIfEmpty()
  where process.Company_ID = Company_ID
  && process.IsActive == true
  // issue is with the following 2 lines of code
  //&& (j == null ? true : subjob.IsActive == true)
  ///&& (p == null ? true : subprocess.IsActive == true)
  select new ProcessIndexView { ID = process.ID, DescShort = process.DescShort, Job_ID = process.Job_ID, ParentProcess_ID = process.ParentProcess_ID, JobValue = (subjob == null ? "(no parent Job for this Process)" : subjob.DescShort), ParentProcessValue = (subprocess == null ? "(no parent Process for this Process)" : subprocess.DescShort ) }).ToList();
查询要求:

  • 所有表中都有一个Company_ID字段。所有逻辑必须在相同的公司ID值内
  • process.Job_ID:[process]“可能”有一个“父”[Job],也可能是零(0)
  • process.ParentProcess_ID:[process]“可能”有一个“父”[process](在[Job]内,如果存在),或者它可能是零(0)
  • [Process].IsActive必须为TRUE
  • 当存在“父”[Job]、[Job].IsActive时,必须为TRUE。否则,父对象不处于活动状态,因此该子对象也不应处于活动状态。 请注意,由于其他系统逻辑,在更新“父”[Job].IsActive值时,我们不希望更新[Process].IsActive值
  • 当存在“父”[Process]、[Process].IsActive时,必须为TRUE。否则,父对象不处于活动状态,因此该子对象也不应处于活动状态。 请注意,由于其他系统逻辑,在更新“父”[Process].IsActive值时,我们不希望更新[Process].IsActive值
  • 我们的数据确实包含所有“有效”数据值-零、活动=真和假,等等
  • 当我们在查询中取消注释两个注释掉的行时,我们得到错误:

    {“无法比较'System.Collections.Generic.IEnumerable`1'类型的元素。仅支持基元类型、枚举类型和实体类型。”}

    根据其他StackOverflow问题,这是“因为WHERE子句中有一个空检查”。 当我们注释掉这两行(如上所述)并将数据减少到一个“不错”的子集时,查询是可以的。但是,这不符合我们的要求#5、6和7-因此不是一个有效的解决方案

    是否有其他方法(重新)构造查询


    感谢您的帮助。请提前感谢。

    j
    p
    由于LINQ的实现方式,永远不会为
    null
    。它们可能为空,但不会为null

    如果要指示如果
    j
    和be为非空或对应的布尔值为活动状态,则应包括行,则需要指示:


    你真的应该重新格式化这些代码,这样你就不会有这么多的水平滚动。这让阅读成为一场噩梦。对于@Servy,感谢你的快速响应。我们想要的不是答案中的“非空”,而是“。。。为空,或者相应的布尔值处于活动状态“。当
    j
    p
    为空时,记录正常。所以我们想要
    j.Empty
    或类似的,否则.IsActive。什么是
    .Empty
    部分?@如果没有任何项目,则集合为空。已经有一种方法可以查看集合是否有任何项,您只需调用它,并对其进行否定,然后您就完成了,您知道集合是空的。哦,n00b误读了您的答案!这太完美了-
    !j、 Any()
    !p、 Any()
    ,注意
    表示“否定它”。经过测试,效果良好。太好了-谢谢你@Servy。
    
    where process.Company_ID == Company_ID //note this probably shouldn't be assignment
        && process.IsActive
        && (!j.Any() || subjob.IsActive)
        && (!p.Any() || subprocess.IsActive)