左外连接LINQ

时间:2015-07-28 13:45:30

标签: c# linq linq-to-entities

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

3 个答案:

答案 0 :(得分:2)

尝试这样的事情:

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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