我有以下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>>
。如何正确执行此操作以在所有角色中拥有一个平面列表?我无法弄清楚如何做到这一点。
答案 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
中实施GetHashCode
和Permission
才能有意义地使用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.