次のようなコードがあります。ただし、これを実行するには、よりデータベース効率の良い方法が必要です。データベースのクエリ数が(1 +(管理者ロールを持つユーザーの数))が間違っている場合は修正してください。
新しいMVC 4プロジェクトでは、メンバーシップのデフォルトはテーブルUserProfile、webpages_Roles、およびwebpages_UsersInRolesです。 Roles.Get *にはたくさんの組み込みメソッドがあります。以下のようなコードを書かないようにしたい場合は、webpages_Rolesとwebpages_UsersInRoles、およびすべてのコードの最初のプロパティのモデルを明示的に作成する必要がありますか。 Roles.Get *からユーザー名だけを取得しても十分ではありません。完全なUserProfileが必要です。
参考以下の "UserRole"オブジェクトは単なる列挙です。
public ActionResult Admins()
{
var dbContext = new UsersContext();
var usernames = Roles.GetUsersInRole(UserRole.SiteAdministrator.ToString());
var adminUsers = new List<UserProfile>();
foreach (string username in usernames)
{
var adminUser = dbContext.UserProfiles.FirstOrDefault(u => u.UserName.ToLower() == username);
adminUser.Roles.Add(UserRole.SiteAdministrator);
adminUsers.Add(adminUser);
}
return View(adminUsers);
}
はい、そうしたくありません。これは非常に非効率的な方法です。
代わりに、設計されたとおりのツールを使用してください。たとえば、次のようになります。
var usernames = Roles.GetUsersInRole(UserRole.SiteAdministrator.ToString());
var adminUsers = dbContext.UserProfiles
.Where(x => usernames.Contains(x.Username)).ToList();
return View(adminUsers);