我喜欢使用ASP.Net Identity(角色)来过滤实体。我使用的是ASP.NET 4.5 MCV EF6。
我的表格是:
我在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的新手。如果有人有办法改进此代码,请随时添加您的观点。
答案 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表达式要容易得多。
希望这有帮助!