左外连接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;
试试这样:
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
employees
中找到这些表项。