C#LINQ多个一对多包含where条件
本文关键字:where 条件 包含 一对多 C#LINQ | 更新日期: 2023-09-27 18:00:56
我找不到正确的查询来获取所需的所有数据。
我有三张样品表:
- 员工(身份证、姓名、电话(
- 员工部门(Id,EmployeeId,DepartmentId(
- 部门地址(Id,部门Id,城市,街道,IsActive…(
每个表都和下一个表有一对多的关系。一个员工可以被分配到多个部门,一个部门可以分配多个地址。
我正在尝试编写一个实体框架查询,例如,它将返回分配到纽约市部门的所有员工。我的问题是,我不想要的只是员工。我需要它还包括Employee类中EmployeeDepartment和DepartmentAddress的所有属性。
我想做的是:
var matchingEmployees = ctx.Employee
.Include("EmployeeDepartment")
.Include("EmployeeDepartment.DepartmentAddress")
.Where(p=> p.EmployeeDepartment
.Where(x=>x.DepartmentAddress.Where(y=>y.City == "New York)))
.ToList();
因此,当我只需要符合Where条件的部门时,我得到了所有部门和所有EmployeeDepartments。什么查询将返回我需要的数据?
您不需要使用where,只需直接访问条件即可。我认为这是类似的,如果你发布你的实体,会更容易一点。
var matchingEmployees = ctx.Employee
.Include("EmployeeDepartment")
.Include("EmployeeDepartment.DepartmentAddress")
.Where(p=> p.DepartmentAddress.City == "New York)))
.ToList();
也许这个:
ctx.Employee
.Include( e => e.EmployeeDepartment)
.Include( e => e.EmployeeDepartment.DepartmentAddress)
.Where(e => && e.EmployeeDepartment.DepartmentAddress.All(y => y.City == "New York")).ToList();
"我要做的是编写实体框架查询,例如,它将返回分配到纽约市部门的所有员工。">
如果您对实际检索部门不感兴趣,只想按它们进行筛选,那么联接将更合适。其他开发人员更容易看到您的意图是缩小员工列表,而不是简单地缩小嵌套部门地址的列表。这可以在扩展语法中完成(我更喜欢(,但联接在表达式语法中可读性更强:
var employeesInNewYorkDepartments =
(from employee in ctx.Employee
let department = employee.EmployeeDepartment
let departmentAddress = department.DepartmentAddress
where departmentAddress.City == "New York"
select employee).ToList();
希望我没有语法错误。这是假设员工和部门之间的关系是多对一的。也就是说,一个部门有很多员工。
如果两种关系都相反:
var employeesInNewYorkDepartments =
(from employee in ctx.Employee
join department in employee.EmployeeDepartments
join departmentAddress in department.DepartmentAddresses
where departmentAddress.City == "New York"
select employee).Distinct().ToList();
请注意,在多方向导航时,导航属性名称应为复数。它们表示对集合的访问,因此单一的导航属性名称极具误导性。(实体类名仍然是单数,因为它声明了单个项的结构。(