2009-05-19 35 views
0

页面具有角色。用户具有角色。如果用户和他共享一个或多个角色,用户只能查看页面。如何轻松判断两个.NET EntityObjects集合是否包含任何相同的对象?

这工作:

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) 

我想是因为角色是EntityObjects失败。

我怎样才能让它只比较角色ID值来确定相等?

回答

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 

但是,如果你打的DB每个页面请求,那么请务必检查探查,并确保您只执行一个查询,而不是一个查询每个角色。

相关问题