Linq 如何编写具有多对多关系的左连接
我拥有以下实体: 实体:部门 部门ID(内部) 姓名(整数) 上级部门ID(int,部门实体的外键) 部门权限(ICollection) 实体:部门权限 部门ID(内部) 用户ID(int) 权限(字符串) 部门(ICollection) 实体:用户 用户ID(int) 名称(字符串) 部门权限(ICollection) 我需要在查询中返回所有部门(包括用户没有权限的部门)以及用户有权限时的权限名称 部门 DepartmentId | Name | SuperiorDepartmentId 1 | Sales | null 2 | Internal Sales | 1 3 | Marketing | null 部门ID |姓名|上级部门ID 1 |销售额|空 2 |内部销售| 1 3 |营销|无效 部门权限 DepartmentId | User Id | Permission 1 | 2 | r 2 | 2 | rw 1 | 3 | rw 部门Id |用户Id |权限 1 | 2 | r 2 | 2 | rw 1 | 3 | rw 用户 UserId | Name 1 | John 2 | Mary 3 | Paul 用户ID |名称 1 |约翰 2 |玛丽 3 |保罗 如果我询问用户Mary(id=2)的数据,我们应该有如下结果集: DepartmentId | Name | SuperiorDepartmentId | Permission 1 | Sales | null | r 2 | Internal Sales | 1 | rw 3 | Marketing | null | null 部门ID |姓名|上级部门ID |权限 1 |销售|空| r 2 |内部销售| 1 | rw 3 |营销|零|零Linq 如何编写具有多对多关系的左连接,linq,c#-4.0,linq-to-entities,entity-framework-5,Linq,C# 4.0,Linq To Entities,Entity Framework 5,我拥有以下实体: 实体:部门 部门ID(内部) 姓名(整数) 上级部门ID(int,部门实体的外键) 部门权限(ICollection) 实体:部门权限 部门ID(内部) 用户ID(int) 权限(字符串) 部门(ICollection) 实体:用户 用户ID(int) 名称(字符串) 部门权限(ICollection) 我需要在查询中返回所有部门(包括用户没有权限的部门)以及用户有权限时的权限名称 部门 DepartmentId | Name | SuperiorDepartmentId 1
我怎样才能做到这一点呢?我假设存在一个导航属性
Department.DepartmentPermissions
var query = from d in context.Departments
select new {
Department = d,
Permissions = d.DepartmentPermissions
.Where(dp => dp.UserId == 2)
.Select(p => p.Permission)
};
var result = query.AsEnumerable()
.Select(x =>
new {
x.Department.DepartmentId,
x.Department.Name,
x.Department.SuperiorDepartmentId,
Permissions =
string.Join(", ", x.Permissions.DefaultIfEmpty("null")
}
首先收集原始数据(query
),然后在内存中合成最终结果。后者之所以执行,是因为EF不允许在LINQ查询中使用string.Join
。您的数据结构允许一个部门中的每个用户拥有多个权限,因此使用字符串.Join
如果您绝对确定始终可以执行一个权限
Permission = d.DepartmentPermissions.Where(dp => dp.UserId == 2)
.Select(p => p.Permission)
.FirstOrDefault()
在查询中
,您的操作完成