2010-01-04 7 views
3

j'ai un modèle simple pour la sécurité où il y a:plusieurs entités beaucoup à de nombreuses requêtes

  • utilisateurs
  • Rôles
  • chemins

et beaucoup de nombreux liens entre ces tables , donc un utilisateur à des rôles, et des rôles à des chemins. J'essaye d'écrire une fonction de sorte que d'un nom d'utilisateur et d'un chemin il renverra une valeur booléenne selon si l'utilisateur a accès à ce chemin. Comment puis-je faire cela avec le framework d'entité? J'ai actuellement:

var rolesForUser = _entities.Users 
     .Include("Roles") 
     .Where(u => u.Login.Equals(username)) 
     .Select(u => u.Roles); 

if(rolesForUser.Count() == 0) return false; 

var authentications = _entities.WebPaths 
     .Where(p => p.Path == path) 
     .WhereIn(p => p.Roles, rolesForUser); 

return (authentications.Count() > 0); 

qui utilise une méthode d'extension WhereIn, mais cela ne peut comparer sur primatives si cela ne fonctionne pas pour le moment. Toutes les suggestions sont les bienvenues

Répondre

1

Vous pouvez probablement le faire avec PredicateBuilder.

Du haut de ma tête:

var predicate = PredicateBuilder.False<WebPath>(); 
foreach (var role in from roles in rolesForUser 
        from r in roles.Role 
        select r) 
{ 
    predicate = predicate.Or (p => p.roles.Any(r => r.Id == role.Id)); 
} 

var authentications = _entities.WebPaths.AsExpandable() 
     .Where(p => p.Path == path) 
     .Where(predicate); 
return (authentications.Count() > 0); 
+0

Salut Craig, vient d'avoir un aller avec cela et sur la ligne: « prédicat = predicate.Or (p => p.roles.Any (r => r.Id == role.Id)); " Je ne suis pas en mesure d'accéder à role.Id car le rôle est un objet System.Data.Objects.DataClasses.EntityCollection plutôt que System.Data.Objects.ObjectQuery . Je suppose que cela est dû à la façon dont je sélectionne dans rolesForUser, bien que je ne sois pas sûr de savoir comment le faire revenir. – bobwah

+0

Quel est le type * exact * (avec les paramètres) de 'rolesForUser'? –

+0

(variable locale) IQueryable > rolesForUser – bobwah

Questions connexes