Linq Join选择返回展平列表

时间:2013-10-16 10:52:56

标签: c# linq

我有以下Linq声明:

var permissions = (from ru in RoleUserStore
                  join role in RoleStore on ru.RoleId equals role.Id
                  where ru.UserId == user.Id
                  select role.Permissions).ToList(); 

我的结果是List<ICollection<Permission>>。如何正确执行此操作以在所有角色中拥有一个平面列表?我无法弄清楚如何做到这一点。

3 个答案:

答案 0 :(得分:4)

ToList()替换为SelectMany(x => x).ToList()

答案 1 :(得分:3)

使用查询语法中的SelectMany

var permissions = from ru in RoleUserStore
                  join role in RoleStore on ru.RoleId equals role.Id
                  where ru.UserId == user.Id
                  from permission in role.Permissions
                  select permission;

 // if you don't want repeating permissions use Distinct:
List<Permission> permissionList = permissions.Distinct().ToList();

请注意,您需要在Equals中实施GetHashCodePermission才能有意义地使用Distinct

答案 2 :(得分:0)

您可以使用SelectMany

var result = (from ru in RoleUserStore
              join role in RoleStore on ru.RoleId equals role.Id
              where ru.UserId == user.Id
              select role.Permissions)
              .SelectMany(user => user).ToList();

这就是SelectMany所做的,我引用了MSDN。

Projects each element of a sequence to an IEnumerable(Of T) and flattens the resulting sequences into one sequence.