2009-05-19 8 views
0

Les pages ont des rôles. Les utilisateurs ont des rôles. Un utilisateur peut uniquement afficher une page s'il partage un ou plusieurs rôles.Comment puis-je savoir si deux collections de .NET EntityObjects contiennent l'un des mêmes objets?

Cela fonctionne:

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 

Je ne veux pas avoir à utiliser des boucles imbriquées si je peux le faire à la place en moins de lignes de code avec LINQ ou une expression lambda.

Cela revient toujours Faux:

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

Je pense qu'il échoue parce que les rôles sont EntityObjects.

Comment puis-je faire comparer uniquement les valeurs Id de rôle pour déterminer l'égalité?

Répondre

2

Vous devez soit utiliser le deuxième paramètre de la méthode Intersect pour fournir votre propre coutume IEqualityComparer ou vous pouvez essayer cela. Cela a l'air plutôt drôle, mais c'est logique une fois que vous avez compris.

If CurrentPage.Roles.Any(Function(Role) Role.Users.Any(Function(User) User.Id = CurrentUser.Id)) Then 
    'User has role 
End If 

Bien que cela puisse ne pas fonctionner si vous devez charger vos utilisateurs à chaque itération. Si vous chargez de EntityFramework, je vous recommande désireux de les charger quelque chose comme ceci:.

CurrentPage.Roles.Include (« Utilisateurs ») Tout (...

Ou j'ai aussi créé ma propre l'extension EnsureLoaded() qui retourne l'objet quelque chose comme ceci:

If CurrentPage.Roles.Any(Function(a) a.Users.EnsureLoaded().Any(Function(b) b.Id = CurrentUser.Id)) Then 

Mais si vous frappez la db chaque demande de page, assurez-vous de vérifier profileur et assurez-vous que exécutiez une requête et non une requête pour chaque rôle

Questions connexes