2011-12-26 10 views
0

ユーザーとロール(特に)を管理できる管理インターフェイスを作成しようとしています。編集、削除、または閲覧できるユーザーの一覧があります。私はアクションでこのコードを持っている:GetAllUsersによって返されたユーザーを、その役割に基づいてフィルタリングできますか?

var model = Membership.GetAllUsers() 
    .Cast<MembershipUser>() 
    .Select(x => new UserModel 
     { 
     UserName = x.UserName, 
     Email = x.Email, 
     UserRoles = Roles.GetRolesForUser(x.UserName) 
     }); 

return View(model); 

これは私が管理者がお互いを編集できないようにすることを除いて、すべての罰金です。だから私は "スーパー管理者"の役割のすべてのユーザーを除外する必要があります。私は確かに各ユーザーがメンバーであるかどうかを確認するために各役割を踏んでこれを理解することができます。 Selectステートメントの結果セットをフィルタリングするか、またはExceptまたはWhereを使用してこれを行うには、すてきな方法があるのだろうかと思っています。

答えて

0

私は通常生成するSQLについて考えています。単純なwhereステートメントを使用すると、ロールがかなり簡単になります。

しかし、クエリの各部分をより小さなビットに抽象化しようとしているように見えますが、これは書きやすいようになりますが、パフォーマンスに壊滅的な影響を与える可能性があります。たとえば、Includeメソッドを使用してGetAllUsersによって返されるユーザーごとに特別なデータベースクエリを発生させるGetRolesForUserメソッドが、同時にすべてのロールを取得するよりはるかに良い方法であれば、私は驚くことはありません。

var model = context.Users 
      .Include(user => user.UserRoles) 
      .Where(user => !user.UserRoles.Any(role => role == superAdmin) 
      .Select(user => new UserModel() { UserName = user.UserName, Email = user.Email, UserRoles = user.UserRoles}); 
関連する問題