左外连接 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
我有一个 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