2010-02-03 5 views
0

En utilisant le modèle Repository et je veux écrire une méthode qui reçoit un rôle et retourne une Iqueryable des utilisateurs qui appartiennent à ce rôle. (Je ne sais pas si la bonne façon serait de recevoir l'objet rôle ou le role_id ... en tout cas, comment puis-je faire cela? Je n'aime pas la structure de la requête, je préfère la structure de la méthode de linq rôles est beaucoup à plusieurs avec une users_roles table de jointure.Aide avec LinqtoSql

 private ClasesDataContext db = new ClasesDataContext(); 
     public IQueryable GetByRole(Role role) 
     { 
      return db.Users.Where(); 
     } 

Répondre

1

Peut-être essayer quelque chose comme:

public IQueryable<User> GetByRoleId(Role role) { 
    return db.UsersRoleJoinTable.Where(ur => ur.Role == role).select(ur => ur.User); 
} 

Où UsersRoleJoinTable est votre many-to-many table de jointure.

Espérons que ça aide.

Mise à jour: select (ur => ur.User) est dit LINQ que pour chaque ligne renvoyée par "db.UsersRoleJoinTable.Where (ur => ur.Role == rôle)" nous voulons la utilisateur associé à l'objet UsersRoleJoinTable. Si vous vouliez une liste d'identifiants d'utilisateur à la place, vous pourriez indiquer à linq de sélectionner seulement user.id en faisant select (ur => ur.id). Pensez à Linq comme une sorte de "pour chaque ligne le faire et le mettre dans la liste retournée à la place de la ligne d'origine"

Il y a un inconvénient à cette approche tho, je crois que dans ce cas Linq génère le sql pour obtenir les lignes de la table Join (UsersRoleJoinTable), puis pour chaque ligne renvoyée, exécute une autre requête pour rechercher l'utilisateur. Je peux me tromper sur ce point, afin de vérifier le SQL généré par LINQ faire:

string sql_query = db.UsersRoleJoinTable.Where(ur => ur.Role == role).select(ur => u.User).ToString(); 

puis imprimer la valeur de sql_query ou regarder en mode de débogage. Si Linq effectue plusieurs requêtes, je pense que la meilleure solution consiste à créer une vue ou une procédure stockée dans SQL Server pour que les utilisateurs soient associés au rôle, puis ajouter la vue ou la procédure stockée au concepteur Visual Studio afin que vous puissiez appeler la vue comme:

db.GetUsers(role_id) //if using a GetUsers stored procedure 

ou

db.UsersByRoleView.where(ur => ur.role_id == passed_role_id) //if using a UsersByRoleView view 
+0

Cela a marché ... auriez-vous intérêt à expliquer comment cela fonctionne ?? Comment se fait-il que 'return db.UsersRoleJoinTable.where ...' puisse retourner une liste d'utilisateurs? – ignaciofuentes

+0

Je ne pense pas qu'il effectue plusieurs requêtes. Je ne peux pas poster toute la requête ici, mais il a juste une instruction SELECT, ce qui signifie que c'est juste une requête à droite? – ignaciofuentes

+0

Si la requête générée a une "jointure" aux utilisateurs et a tous les champs de la table de l'utilisateur dans la partie SELECT du SQL, alors oui, Linq est intelligent et n'exécute qu'une seule requête. Si la requête générée n'a pas les utilisateurs "Join" dans le SQL généré, cela signifie qu'elle exécutera d'autres requêtes en arrière-plan pour récupérer les informations de la table utilisateur. –

1

Si vous avez une instance de l'objet Rôle

public IQueryable<User> GetByRole(Role role) { 
     return db.Users.Where(u => u.Role == role); 
} 

travaillerait.

Si vous ne le faites pas, mais il suffit de savoir la Id ou une autre propriété du rôle quelque chose comme ça pourrait être bette r.

public IQueryable<User> GetByRoleId(int roleId) { 
    return db.Users.Where(u => u.Role.Id == roleId); 
} 
+0

il ne peut pas être u.Role parce qu'il est pas directement lié .. il y a une table de jointure. – ignaciofuentes