2009-05-19 17 views
0

ページにはロールがあります。ユーザーにはロールがあります。ユーザーは、1人以上の役割を共有する場合にのみ、ページを閲覧することができます。.NET EntityObjectの2つのコレクションに同じオブジェクトが含まれているかどうかを簡単にどのように確認できますか?

これは動作します:

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やラムダ式と少ないコードでそれを行うことができれば、ネストされたループを使用する必要がありますする必要はありません。

これは常にFalseを返す:

Dim Allow As Boolean = (CurrentPage.Roles.ToList.Intersect(CurrentUser.Roles.ToList).Count > 0) 

私は役割がEntityObjectsがあるので、それが失敗したと思います。

ロールIDの値のみを比較して同等性を判断するにはどうすればよいですか?

答えて

2

独自のカスタムIEqualityComparerを提供するには、Intersectメソッドの2番目のパラメータを使用するか、これを試す必要があります。それはちょっと面白いように見えますが、一度それを掛けると意味があります。

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 

しかし、あなたはデシベルに、各ページのリクエストをヒットしている場合、あなたはプロファイラをチェックして、あなただけのために1つのクエリではなく1つのクエリを実行していることを確認してくださいことを確認してください各役割。

関連する問題