Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 如何编写具有多对多关系的左连接_Linq_C# 4.0_Linq To Entities_Entity Framework 5 - Fatal编程技术网

Linq 如何编写具有多对多关系的左连接

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

我拥有以下实体:

实体:部门 部门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 |营销|零|零
我怎样才能做到这一点呢?

我假设存在一个导航属性
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()
查询中
,您的操作完成