左外连接 LINQ

Left Outer Join LINQ

我有一个 LINQ 查询,可以对公司员工和公司会议的与会者列表进行排序。我想提取 不是 会议参与者的员工。因此,左外部联接似乎是最佳的 LINQ 策略。当我调试并单步执行代码时,employeesNotInMeetings 返回了所有员工,未能删除与会者的员工。为什么这个左外连接无法删除正确的列表条目?

        //Query for all attendees who are employees
        List<Attendee> employeesWhoAreAttendees = db.Attendees.Select(ea => ea).ToList();
        //Query for all employees in database
        List<Employee> employees = db.Employees.Select(ee => ee).ToList();

        var employeesNotInMeetings = from emp in employees
                                     join att in employeesWhoAreAttendees
                                     on emp.EmployeeID equals att.EmployeeID into gj
                                     from gji in gj.DefaultIfEmpty()
                                     //If EmployeeID < 0, the attendee is not an employee
                                     where emp.EmployeeID > 0 
                                     select emp;

尝试这样的事情:

employees.Where(x => employeesWhoAreAttendees.All(y => x.EmployeedID != y.EmployeeID))

我想你可能想要这样的东西:

db.Employees.Where(e => !e.Attendees.Any());

请注意,这是假设您在员工和与会者 table 之间设置了一个外键,并且 Employee 上的 ICollection 导航 属性 是名为 Attendees

另请注意,您通常不应直接在未过滤的 DBSet 上调用 ToList()。它会将整个 table 拉回内存,然后进行过滤。如果让 SQL 为您进行过滤,您将获得更好的性能。

这就是左连接应该做的:returns 左侧的所有条目 (employees) 即使右侧没有结果 (employeesWhoAreAttendees).如果您想让员工不参加会议 - 那么您应该使用 left excluding join 并在 table employees 中找到那些条目,其中 table 中没有条目(空) employeesWhoAreAttendees