我对Linq有点新鲜,并希望有人可以帮助我解决我目前正在捣乱的事情。
我目前有2个列表
public IQueryable<TRole> Roles
{
get
{
var roles = new List<TRole>();
roles.Add(CreateIdentityRole("Chairman", "Voorzitter"));
roles.Add(CreateIdentityRole("Treasurer", "Penningmeester"));
roles.Add(CreateIdentityRole("Ranking Responsible", "Rankingverantwoordelijke"));
roles.Add(CreateIdentityRole("Competition Responsible", "Competitieverantwoordelijke"));
roles.Add(CreateIdentityRole("Webmaster", "Webbeheerder"));
roles.Add(CreateIdentityRole("Secretary", "Secretaris"));
foreach(TRole role in roles)
{
if (!_roles.Contains(role))
_roles.Add(role);
}
return _roles.AsQueryable<TRole>();
}
}
private TRole CreateIdentityRole(string id, string name)
{
TRole role = (TRole)Activator.CreateInstance(typeof(TRole));
role.Id = id;
role.Name = name;
return role;
}
public void InitializePrivacy(IdentityUser user)
{
var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
var roleManager = new RoleStore<IdentityRole>();
var roles = roleManager.Roles;
List<string> userRoles = manager.GetRoles(user.Id);
}
现在我想使用Linq来获取userRoles中找不到的所有角色。因为角色是可查询的,我现在不知道如何实现这样的结果。
答案 0 :(得分:2)
简单的.Except()
应该足够了:
using System.Linq;
//...
var roles = roleManager.Roles.ToList();
List<string> userRoles = manager.GetRoles(user.Id);
var ununsedRoles = roles.Execpt(userRoles);
这将为您提供所有项目角色,userRoles
中的角色除外。
MSDN:https://msdn.microsoft.com/en-us/library/bb300779(v=vs.110).aspx
答案 1 :(得分:2)
您可以使用IEnumerable接口。如果您的方法返回Querable结果,它将起作用。试试这个:
IEnumerable<string> roles = roleManager.Roles;
List<string> userRoles = GetRoles(user.Id);
var result = roles.Except(userRoles);
答案 2 :(得分:1)
获取userRoles
中未找到的角色集合:
var rolesNotFound = roleManager.Roles
.Where(r => !userRoles.Select(u => u.Id).Contains(r.Id))
.ToList();