2

私は次のコードを持っています。しかし、これを行うには、よりデータベース効率の高い方法が必要です。なぜなら、Imが間違っている場合は、データベースクエリの数が(1 +(管理者ロールを持つユーザーの数))である場合に修正してください。

新しいMVC4プロジェクトでは、メンバーシップのデフォルトは、テーブル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);
    }
4

1 に答える 1

5

はい、あなたはそれをそのようにしたくありません。これは非常に非効率的な方法です。

代わりに、設計どおりのツールを使用してください。たとえば、次のようなものです。

var usernames = Roles.GetUsersInRole(UserRole.SiteAdministrator.ToString());

var adminUsers = dbContext.UserProfiles
     .Where(x => usernames.Contains(x.Username)).ToList();

return View(adminUsers);
于 2012-09-20T01:19:12.053 に答える