使用LINQ进行左外连接和排除操作

3

我正在尝试从第一个查询结果中排除在第二个查询结果中出现的内容。

这里是SQL语句,其中A是当前查询,B是旧查询。

enter image description here

我一直在尝试使用这篇指南来进行左连接,但我似乎无法弄清楚它在我的案例中应该如何工作。我不理解这应该如何运作(我无法让语法高亮显示正常)。

var emp = from employee in empl
    join jc in jce on callout.job_class_code_fk equals jc.job_class_code_fk
    join av in ab on employee.employee_id_pk equals av.employee_id_fk
    join sh in sho on employee.employee_id_pk equals sh.employee_id_fk into lj
    from rnd2 in lj.DefaultIfEmpty()
    orderby employee.seniority descending
    select new
    {
      eid = employee.employee_id_pk,
      sen = employee.seniority,
      nam = employee.employee_name,
      pho = employee.phone_number,
      lje = sho == null ? sho.employee_id_fk : null //left outer join with exclusion??
    };

编辑:根据评论中的建议,我尝试了以下两种方法。虽然我不再有语法问题,但是以下两种方法都没有返回任何结果,所以仍然存在问题。

    var emp = from employee in empl
              join jc in jce on callout.job_class_code_fk equals jc.job_class_code_fk
              join av in ab on employee.employee_id_pk equals av.employee_id_fk
              join sh in sho on employee.employee_id_pk equals sh.employee_id_fk into lj
              from rnd2 in lj.DefaultIfEmpty() where sho == null
              orderby employee.seniority descending
              select new
              {
                  eid = employee.employee_id_pk,
                  sen = employee.seniority,
                  nam = employee.employee_name,
                  pho = employee.phone_number,
              };

    var emp = from employee in empl
              join jc in jce on callout.job_class_code_fk equals jc.job_class_code_fk
              join av in ab on employee.employee_id_pk equals av.employee_id_fk
              join sh in sho on employee.employee_id_pk equals sh.employee_id_fk into lj
              from rnd2 in lj.DefaultIfEmpty() where rnd2 == null
              orderby employee.seniority descending
              select new
              {
                  eid = employee.employee_id_pk,
                  sen = employee.seniority,
                  nam = employee.employee_name,
                  pho = employee.phone_number,
              };

我真的不明白为什么我的问题被认为是重复的,因为我实际上用一种有能力的搜索者可以找到的语言提出了这个问题,并花时间提供了图表、代码示例和参考资料。另一个问题可能从根本上来说是在问同样的事情,但这两个问题相差甚远。 - undefined
1
从图片中的英文内容翻译成中文:WHERE B.Key IS NULL 在你的查询中翻译为 where rnd2 == null - undefined
Luis,我不是在问如何执行左外连接,我是在问如何执行带有排除的左外连接。 - undefined
Ivan Stoev,但是在排除之前,我需要进行左连接,对吗? - undefined
是的,用sh替换rnd2会更合理。所以,在完成左连接之后,我想选择右侧为空的行,对吗? - undefined
显示剩余6条评论
1个回答

1

好的,对我来说(无论如何),最容易阅读和理解的答案就是这个。

创建两个列表,一个是我想要排除的列表,另一个是主列表。

然后我们运行 master.Except(exclude),就完成了排除的左外连接效果。

以下是可工作的代码。上面的解决方案也可能有效,因为第一个列表的组合方式还有其他问题。

            var ex = from employee in empl
                 join sh in sho on employee.employee_id_pk equals sh.employee_id_fk
                 select new
                 {
                     eid = employee.employee_id_pk,
                     sen = employee.seniority,
                     nam = employee.employee_name,
                     pho = employee.phone_number,
                 };
        ex.Distinct();

        //get a list of employees who have the enabled orientations and job classifications
        var emp = from employee in empl
                  join jc in jce on employee.employee_id_pk equals jc.employee_id_fk
                  join av in ab on employee.employee_id_pk equals av.employee_id_fk
                  orderby employee.seniority descending
                  select new
                  {
                      eid = employee.employee_id_pk,
                      sen = employee.seniority,
                      nam = employee.employee_name,
                      pho = employee.phone_number,
                  };
        emp = emp.Distinct();
        emp = emp.Except(ex);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接