C# 在Identity 2.2.1中具有角色列表的用户列表

C# 在Identity 2.2.1中具有角色列表的用户列表,c#,linq,lambda,asp.net-identity,asp.net-identity-2,C#,Linq,Lambda,Asp.net Identity,Asp.net Identity 2,所以我一直在搜索谷歌等等。感觉这个问题已经被问了很多次了,但是没有任何答案可以帮助我,但是我感觉我离这个问题越来越近了。然而,我对林克和兰姆达都是新手,没有知识去做我想做的事情 期望结果 我离和很近。这是我到目前为止得到的 视图模型: 控制器: 试验1 此解决方案为角色返回空格,我必须将其添加到我的web.config文件中: 试验2 此解决方案为每个角色的每个用户返回一行,但仅返回RoleId 以下是我将RoleId更改为RoleName后在试用2中得到的结果: 我可以看出,在试用版2中,u

所以我一直在搜索谷歌等等。感觉这个问题已经被问了很多次了,但是没有任何答案可以帮助我,但是我感觉我离这个问题越来越近了。然而,我对林克和兰姆达都是新手,没有知识去做我想做的事情

期望结果 我离和很近。这是我到目前为止得到的

视图模型: 控制器: 试验1 此解决方案为角色返回空格,我必须将其添加到我的web.config文件中:

试验2 此解决方案为每个角色的每个用户返回一行,但仅返回RoleId

以下是我将RoleId更改为RoleName后在试用2中得到的结果:

我可以看出,在试用版2中,u.Roles链接到UserRoles表。从逻辑上讲,我知道我想要的是内部联接Roles表并在那里获得名称


我希望有人能帮我?提前谢谢

您不需要在LINQ查询中执行join,因为UserRole只是用户的导航属性,所以它们将由EF自动映射。唯一需要记住的是,如果禁用延迟加载,则需要手动调用Includeentity将实体加载到查询中

代码示例:

如果禁用延迟加载:

在启用延迟加载的情况下:

更新: 我还没有看到您的模型类,但我认为您有3个模型类Users、Roles、UserRoles,因为User和Role具有多对多关系,如gif所示,Roles只有UserId和RoleId

public class UsersController : Controller {
    public async Task Index() {
        var users = allUsers.Select(u => new UserViewModel {UserName = u.UserName, Roles = String.Join(",", u.UserRoles.Where(userRole => u.Roles.Select(r => r.RoleId).Contains(userRole.Id)).Select(userRole => userRole.Name)}).ToList();
        return View(users);
    }
}

多亏了@Kienct89和我们的讨论,我自己意外地找到了答案。这是我得到的,如果有人可以或想要改进,请这样做

e、 g:我不知道是否最好先将所有角色放入一个变量中并对其进行迭代,您可以在版本1中看到这一点,或者不喜欢在版本2中看到这一点

版本1 版本2优先?
我觉得版本2的效率更高,因为它不会访问数据库来获取每个用户的角色。相反,它在变量中具有角色。我不确定我是否正确,但我希望受到启发,并向任何知道的人学习。

var users=allUsers.Selectu=>newuserviewmodel{UserName=u.UserName,Roles=String.Join,,u.Roles.Selectr=>r.RoleName}.ToList;由于它已经在工作,您可以尝试在第二个对话框中选择角色名称而不是角色idtrial@kienct89,谢谢你的回答,我也这么想,因为我到处都能看到这个答案。我想我应该声明我使用的是Identity 2.2.1,这可能改变了情况。@kienct89,另外,我想你错过了我说过的在试用版2中,u.Roles链接到UserRoles表的部分。从逻辑上讲,我知道我想要的是内部联接Roles表并在那里获取名称。这正是查询所做的。查询中不会有任何联接,因为角色只是用户的导航属性。如果启用延迟加载,则只需执行select查询。如果禁用延迟加载,则需要在查询中调用IncludeRoles。希望它能帮你降温。不熟悉包含,我将研究它,因为我目前正在尝试学习lambda。另外,如果你把它作为一个答案发布,并且它有效,我会接受它。若你们能为两者提供解决方案,那个就太好了,这样我就可以选择适合我项目的任何东西,这样我就可以从示例中学习。谢谢谢谢如何知道是否启用或禁用了延迟加载?仅供参考:这是一个全新的MVC 5项目,使用VS2013 Update 5创建,带有用于身份验证的个人帐户。默认情况下,它处于启用状态。您可以尝试查看dbcontext代码。如果在构造函数配置中找不到类似的代码。LazyLoadingEnabled=false;,然后启用延迟加载。谢谢。那么我想它已经启用了。但您的延迟加载示例正是我在其他示例中看到的代码,但它不起作用。我将尝试创建一个简短的gif来向您展示。当我说它“不起作用”时,我的意思是它显示为红色,我无法解析符号rolenameno不确定你的意思,但我实际上更新了名称,使其完全符合我在应用程序中的使用方式。视图模型实际上是一个应用程序用户,但为了简单起见,我只使用了用户名。我更改了它,这样我的GIF示例就不会让任何人感到困惑。让我们来看看。
public class UsersViewModel {
    [Display(Name = "User")]
    public ApplicationUser User { get; set; }

    [Display(Name = "Roles")]
    public string Roles { get; set; }
}
public class UsersController : Controller {
    public async Task Index() {
        var allUsers = await db.Users.ToListAsync();
        var users = new List();
        foreach (var user in allUsers) {
            String[] roles = Roles.GetRolesForUser(user.UserName);
            users.Add(new UsersViewModel {User = u, Roles = String.Join(",", roles.ToArray())});
        }
        return View(users);
    }
}
public class UsersController : Controller {
    public async Task Index() {
        var allUsers = await db.Users.ToListAsync();
        var users = allUsers.Select(u => new UsersViewModel {User = u, Roles = String.Join(",", u.Roles.Select(r => r.RoleId))}).ToList();
        return View(users);
    }
}
public class UsersController : Controller {
    public async Task Index() {
        var users = allUsers.Include(Roles).Select(u => new UserViewModel {UserName = u.UserName, Roles = String.Join(",", u.Roles.Select(r => r.RoleName))}).ToList();
        return View(users);
    }
}
public class UsersController : Controller {
    public async Task Index() {
        var users = allUsers.Select(u => new UserViewModel {UserName = u.UserName, Roles = String.Join(",", u.Roles.Select(r => r.RoleName))}).ToList();
        return View(users);
    }
}
public class UsersController : Controller {
    public async Task Index() {
        var users = allUsers.Select(u => new UserViewModel {UserName = u.UserName, Roles = String.Join(",", u.UserRoles.Where(userRole => u.Roles.Select(r => r.RoleId).Contains(userRole.Id)).Select(userRole => userRole.Name)}).ToList();
        return View(users);
    }
}
public class UsersController : Controller {
    public async Task Index() {
        var allUsers = await db.Users.ToListAsync();
        var users = allUsers.Select(u => new UsersViewModel {User = u, Roles = String.Join(",", db.Roles.Where(role => role.Users.Any(user => user.UserId == u.Id)).Select(r => r.Name))}).ToList();
        return View(users);
    }
}
public class UsersController : Controller {
    public async Task Index() {
        var allUsers = await db.Users.ToListAsync();

        // set all roles to a variable, so that we don't hit the database for every user iteration
        // is this true?
        var allRoles = await db.Roles.ToListAsync();

        var users = allUsers.Select(u => new UsersViewModel {User = u, Roles = String.Join(",", allRoles.Where(role => role.Users.Any(user => user.UserId == u.Id)).Select(r => r.Name))}).ToList();
        return View(users);
    }
}