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