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。什么查询将返回我需要的数据?

C#LINQ多个一对多包含where条件

您不需要使用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();

请注意,在多方向导航时,导航属性名称应为复数。它们表示对集合的访问,因此单一的导航属性名称极具误导性。(实体类名仍然是单数,因为它声明了单个项的结构。(