Linq Join Select 以返回平展列表

本文关键字:列表 返回 Join Select Linq | 更新日期: 2023-09-27 18:35:39

>我有以下 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>>。如何正确执行此操作以在所有角色中拥有一个平面列表?我不知道该怎么做。

Linq Join Select 以返回平展列表

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

使用查询语法中的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();

请注意,您需要在Permission中实现EqualsGetHashCode才能有意义地使用Distinct

您可以使用 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.