ASP.Net MVC按身份过滤

时间:2015-10-09 10:22:44

标签: asp.net-mvc linq asp.net-identity

我喜欢使用ASP.Net Identity(角色)来过滤实体。我使用的是ASP.NET 4.5 MCV EF6。

我的表格是:

  • 导航(NavigationId,NavName等)
  • NavigationRoles(NavigationId,RoleId,BlogRigth)

我在Navigations中针对一个角色的过滤器是:

var Nav= db.Navigations
                                .Join(db.NavigationRoles
                                ,n => n.NavigationId
                                ,nr =>nr.NavigationId
                                ,(n ,nr) => new { n , nr  })
                                .Where(x => x.nr.RoleId.Equals("dbd7d691-......"))
                                .Where(x => x.n.ParentId==1)
                                .Select(x=> x.n )
                                .Distinct()
                                .ToList() ;

我的用户可以拥有一系列角色,因此我希望按这些集合进行过滤。 我得到了Roles的收藏:

 var UserRoleIDs = UserManager.FindById(UserId).Roles.Select(ri=> ri.RoleId);

如何以良好的方式链接这些?

我一般都是LINQ,Lambda和MVC的新手。如果有人有办法改进此代码,请随时添加您的观点。

1 个答案:

答案 0 :(得分:0)

这里的技巧是在用户角色列表中使用Contains()。以下是您的实体的示例。

var UserRoleIDs = UserManager.FindById(UserId).Roles.Select(ri => ri.RoleId);


var query = from navRoles in db.NavigationRoles
            join nav in db.Navigations on navRoles.NavigationId equals nav.NavigationId
            where UserRoleIDs.Contains(navRoles.RoleId)
            select nav;


var distinct = query.Distinct().ToList();

我没有使用LINQ express,因为我发现在涉及连接时编写lambda表达式要容易得多。

希望这有帮助!