页面有角色。用户有角色。如果用户和他共享一个或多个角色,则用户只能查看该页面。
这有效:
Dim Allow As Boolean = False
CurrentPage.Roles.Load()
For Each r As Role In CurrentPage.Roles
r.Users.Load()
For Each u As User In r.Users
If u.Id = CurrentUser.Id Then
Allow = True
Exit For
End If
Next
If Allow Then
Exit For
End If
Next
我不想使用嵌套循环,如果我可以使用LINQ或lambda表达式在更少的代码行中完成它。
这总是返回False:
Dim Allow As Boolean = (CurrentPage.Roles.ToList.Intersect(CurrentUser.Roles.ToList).Count > 0)
我认为它失败了,因为Roles是EntityObjects。
如何使其仅比较Role Id值以确定相等性?
答案 0 :(得分:2)
您必须使用Intersect方法的第二个参数来提供自己的自定义IEqualityComparer,或者您可以尝试这样做。它看起来很有趣,但一旦掌握了它就会有意义。
If CurrentPage.Roles.Any(Function(Role) Role.Users.Any(Function(User) User.Id = CurrentUser.Id)) Then
'User has role
End If
虽然如果您必须在每次迭代中加载用户,这可能不起作用。如果您从EntityFramework加载,我建议您急切地加载它们:
CurrentPage.Roles.Include( “用户”),任何(...
或者我也创建了自己的EnsureLoaded()扩展,它返回如下对象:
If CurrentPage.Roles.Any(Function(a) a.Users.EnsureLoaded().Any(Function(b) b.Id = CurrentUser.Id)) Then
但是如果你在每个页面请求中遇到数据库,那么请确保检查分析器并确保只对每个角色执行一个查询而不是一个查询。