左外连接LINQ

本文关键字:LINQ 连接 | 更新日期: 2023-09-27 18:05:20

我有一个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;

左外连接LINQ

试试这样:

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

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

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

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

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

这就是左连接应该做的事情:它返回左侧(employees)的所有条目,即使右侧(employeesWhoAreAttendees)没有结果。如果您想让员工不在会议中,那么您应该使用左排除连接,并在表employeesWhoAreAttendees

中没有表项(null)的employees中找到这些表项。