C# 如何在核心身份中对用户和角色进行排序

C# 如何在核心身份中对用户和角色进行排序,c#,asp.net-core-identity,asp.net-core-2.2,C#,Asp.net Core Identity,Asp.net Core 2.2,我试图在视图中显示用户的角色列表 这是我当前的输出: 角色|电子邮件 A|aaa@example.com B|bbb@example.com B|abc@example.com C|baa@example.com 但我希望它是这样的: 角色|电子邮件 A|aaa@example.com B|abc@example.com然后包括(u=>u.User).OrderBy(r=>r.Name.ToList(); 返回视图(usersWithRole); } Index.cshtml @{ V

我试图在视图中显示用户的角色列表

这是我当前的输出:

角色|电子邮件

A|aaa@example.com

B|bbb@example.com

B|abc@example.com

C|baa@example.com

但我希望它是这样的:

角色|电子邮件

A|aaa@example.com

B|abc@example.com然后包括(u=>u.User).OrderBy(r=>r.Name.ToList(); 返回视图(usersWithRole); } Index.cshtml

@{
    ViewData["Title"] = "Index";
    ViewData["Name"] = "Index";
    int count = 1;
}
<table class="table table-striped bg-white">
    <thead>
        <tr>
            <th>No</th>
            <th>Role</th>
            <th>Email</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var role in Model)
        {
            var result = role.UserRoles;
            @foreach(var userRole in result)
            {
                <tr>
                    <td>@count</td>
                    <td>@role.Name</td>
                    <td>@userRole.User</td>
                </tr>
                count++;
            }   
        }
    </tbody>
</table>
@{
ViewData[“标题”]=“索引”;
ViewData[“名称”]=“索引”;
整数计数=1;
}
不
角色
电子邮件
@foreach(模型中的var角色)
{
var result=role.UserRoles;
@foreach(结果中的var userRole)
{
@计数
@角色名称
@用户角色
计数++;
}   
}
ApplicationRole.cs

public class ApplicationUser : IdentityUser
{
    public ICollection<ApplicationUserRole> UserRoles { get; set; }
}
公共类应用程序用户:IdentityUser
{
公共ICollection用户角色{get;set;}
}
ApplicationUserRole.cs

public class ApplicationUserRole : IdentityUserRole<string>
{
    public virtual ApplicationUser User { get; set; }
    public virtual ApplicationRole Role { get; set; }
}
公共类ApplicationUserRole:IdentityUserRole
{
公共虚拟应用程序用户{get;set;}
公共虚拟应用程序角色{get;set;}
}
ApplicationUser.cs

public class ApplicationUser : IdentityUser
{
    public ICollection<ApplicationUserRole> UserRoles { get; set; }
}
公共类应用程序用户:IdentityUser
{
公共ICollection用户角色{get;set;}
}
ApplicationDbContext.cs

protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.Entity<ApplicationUserRole>(userRole =>
        {
            userRole.HasKey(ur => new { ur.UserId, ur.RoleId });

            userRole.HasOne(ur => ur.Role)
                .WithMany(r => r.UserRoles)
                .HasForeignKey(ur => ur.RoleId)
                .IsRequired();

            userRole.HasOne(ur => ur.User)
                .WithMany(r => r.UserRoles)
                .HasForeignKey(ur => ur.UserId)
                .IsRequired();
        });
    }
模型创建时受保护的覆盖无效(ModelBuilder)
{
基于模型创建(生成器);
builder.Entity(userRole=>
{
HasKey(ur=>new{ur.UserId,ur.RoleId});
userRole.HasOne(ur=>ur.Role)
.WithMany(r=>r.UserRoles)
.HasForeignKey(ur=>ur.RoleId)
.IsRequired();
userRole.HasOne(ur=>ur.User)
.WithMany(r=>r.UserRoles)
.HasForeignKey(ur=>ur.UserId)
.IsRequired();
});
}
使用
ThenBy()
方法对下面的第二个排序列进行
按名称排序,电子邮件asc

 var usersWithRole = _roleManager.Roles.Include(r => r.UserRoles)
                      .ThenInclude(u => u.User)
                      .OrderBy(r => r.Name)
                      .ThenBy(l => l.Email)
                      .ToList();
使用
ThenBy()
方法对下面的第二个排序列进行
orderbyname,Email asc

 var usersWithRole = _roleManager.Roles.Include(r => r.UserRoles)
                      .ThenInclude(u => u.User)
                      .OrderBy(r => r.Name)
                      .ThenBy(l => l.Email)
                      .ToList();

我设法找到了一种方法来得到我想要的结果

我为表创建实体并通过linq访问它,而不是使用Identity的UserManager和RoleManager

然后,我将结果绑定到ViewModel并在视图中显示它

控制器

public IActionResult Index()
    {

        //var usersWithRole = _roleManager.Roles.Include(r => r.UserRoles).ThenInclude(u => u.User).OrderBy(r => r.Id).ToList();

        var roleAndUsers = (from r in _context.Role
                     join ur in _context.UserRole
                     on r.Id equals ur.RoleId
                     join u in _context.User
                     on ur.UserId equals u.Id
                     orderby r.Name, u.Email
                     select new UserAndRoleViewModel { Name = r.Name, Email = u.Email, Id = u.Id }).ToList();

        return View(roleAndUsers);
    }
视图模型

public class UserAndRoleViewModel
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Id { get; set; }
}
看法

@{
ViewData[“标题”]=“索引”;
整数计数=1;
}
不
角色
电子邮件
@foreach(模型中的var角色)
{
@计数
@角色名称
@角色。电子邮件
计数++;
}
应用程序上下文

    public DbSet<ApplicationRole> Role { get; set; }
    public DbSet<ApplicationUserRole> UserRole { get; set; }
    public DbSet<ApplicationUser> User { get; set; }
公共数据库集角色{get;set;}
公共数据库集用户角色{get;set;}
公共数据库集用户{get;set;}

我设法找到了一种方法来获得我想要的结果

我为表创建实体并通过linq访问它,而不是使用Identity的UserManager和RoleManager

然后,我将结果绑定到ViewModel并在视图中显示它

控制器

public IActionResult Index()
    {

        //var usersWithRole = _roleManager.Roles.Include(r => r.UserRoles).ThenInclude(u => u.User).OrderBy(r => r.Id).ToList();

        var roleAndUsers = (from r in _context.Role
                     join ur in _context.UserRole
                     on r.Id equals ur.RoleId
                     join u in _context.User
                     on ur.UserId equals u.Id
                     orderby r.Name, u.Email
                     select new UserAndRoleViewModel { Name = r.Name, Email = u.Email, Id = u.Id }).ToList();

        return View(roleAndUsers);
    }
视图模型

public class UserAndRoleViewModel
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Id { get; set; }
}
看法

@{
ViewData[“标题”]=“索引”;
整数计数=1;
}
不
角色
电子邮件
@foreach(模型中的var角色)
{
@计数
@角色名称
@角色。电子邮件
计数++;
}
应用程序上下文

    public DbSet<ApplicationRole> Role { get; set; }
    public DbSet<ApplicationUserRole> UserRole { get; set; }
    public DbSet<ApplicationUser> User { get; set; }
公共数据库集角色{get;set;}
公共数据库集用户角色{get;set;}
公共数据库集用户{get;set;}

Hi Rahul,我尝试了你的建议,但它返回了错误。”ApplicationRole'不包含'Email'的定义,并且找不到可访问的扩展方法'Email'接受类型为'ApplicationRole'的第一个参数(您是否缺少using指令或程序集引用?@JustinOng Then post
ApplicationRole
实体模式我已添加了我的ApplicationBContext.csHi Rahul,我试过你的建议,但还是有错误ApplicationRole'不包含'Email'的定义,并且找不到可访问的扩展方法'Email'接受类型为'ApplicationRole'的第一个参数(您是否缺少using指令或程序集引用?@justing然后post
ApplicationRole
实体模式我已添加了我的ApplicationDbContext.cs