Ste*_*ven 13 c# linq asp.net entity-framework
我有一个多对多的关系定义如下:
Employees
--------------
EmployeeID (PK)
Roles
--------------
RoleID (PK)
EmployeeRoles
--------------
EmployeeID (PK, FK)
RoleID (PK, FK)
Run Code Online (Sandbox Code Playgroud)
我正在尝试获取一个Employees列表,给出一个列表或RoleIDs:
private MyDBEntities _entities;
public SqlEmployeesRepository(MyDBEntities entities)
{
_entities = entities;
}
public IQueryable<Employee> GetEmployeesForRoles(int[] roleIds)
{
// get employees
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试这样做_entities.EmployeeRoles
,就没有EmployeeRoles对象.我的edmx看起来像这样:
所以它识别了两个表之间的关系,但它没有为EmployeeRoles创建一个实体对象.
如何在给出角色ID列表的情况下获得明确的员工列表?
Bro*_*ass 31
表Role和Employee之间的关系表示为导航属性 - 实体中的每个Employees
属性Role
仅包含具有此特定角色的Employees.
反过来说 - 每个员工的Roles
财产只包含特定员工的角色.
给定一组roleIds
要查找的角色,您可以使用此角色获取在该集合中具有角色的员工列表:
public IQueryable<Employee> GetEmployeesForRoles(int[] roleIds)
{
var employees = _entities.Employees
.Where( x=> x.Roles.Any(r => roleIds.Contains(r.RoleID)))
return employees;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
获得员工的另一种方法是从关系的另一方面解决问题(从角色开始,而不是从员工开始).这很可能不如第一种方法那么有效,因为我们必须对员工进行重复删除(否则具有两个角色的员工将出现两次):
public IQueryable<Employee> GetEmployeesForRoles(int[] roleIds)
{
var employees = _entities.Roles
.Where( r => roleIds.Contains(r.RoleID))
.SelectMany( x=> x.Employees)
.Distinct()
return employees;
}
Run Code Online (Sandbox Code Playgroud)