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
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
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
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. –