在Queryable中使用Linq的C#

时间:2017-04-06 10:50:31

标签: c# asp.net linq

我对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中找不到的所有角色。因为角色是可查询的,我现在不知道如何实现这样的结果。

3 个答案:

答案 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();