C# Linq Join Select返回展开列表
我有以下Linq声明:C# Linq Join Select返回展开列表,c#,linq,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(); 我的结果是一个列表。我如何正确地做到这一点,以便在
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();
我的结果是一个列表
。我如何正确地做到这一点,以便在所有角色中都有一个平面列表?我想不出怎么做。将ToList()
替换为SelectMany(x=>x)。ToList()
您可以使用
这就是SelectMany所做的,我引用MSDN
将序列中的每个元素投影到一个IEnumerable(of T)中,并将结果序列展平为一个序列。
使用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();
var permissions=来自RoleUserStore中的ru
在ru.RoleId等于role.Id的RoleStore中加入角色
其中ru.UserId==user.Id
来自角色中的权限。权限
选择权限;
//如果不希望重复权限,请使用Distinct:
List permissionList=permissions.Distinct().ToList();
请注意,您需要在
权限中实现Equals
和GetHashCode
,才能有意义地使用Distinct
。我认为SelectMany是您所需要的。您可能需要向其中添加.Distinct()
,以删除所有重复项。
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();