一个简单的查询正在生成多个嵌套记录

A simple query is generating multiple nested records

我不确定我是否做错了,或者 Entity Framework 返回了多个嵌套结果,我无法弄清楚为什么或如何阻止它发生。

我正在尝试获取特定角色的用户列表:

return _context.users.Include(user => user.UserRoles)
            .ThenInclude(ur => ur.Role).Where(ro => ro.UserRoles.Any(i => i.roleId == role.RoleId)).Take(10).ToList();

我有三个模型:User、UserRoles、Role

用户通过 UserRoles 拥有多个角色

public virtual ICollection<UserRole> UserRoles { get; set; }

UserRole属于User,属于Role

public virtual Role Role { get; set; }     
public virtual User User { get; set; }

和角色

public virtual ICollection<UserRole> UserRoles { get; set; }

当我查询给定角色的所有用户列表时,我得到以下类型的结果:

[
{
    name: 'xxxx', 
    email: 'xxxx', 
    userRoles: [{
        userRoleId: '',
        roleId: '',
        role: {
            roleId: '',
            name:'',
            userRoles: [
                {
                    userRoleId: '',
                    roleId: '',
                    user: {
                        and the loop continues
                    }
                }
            ]
        }
    }
    ]
}
]

我期待以下结果:

[
  {
    name: 'xxxx', 
    email: 'xxxx', 
    userRoles: [{
        userRoleId: '',
        roleId: '',
        role: {
            roleId: '',
            name:''                
        }
    }
    ]
  }
]

services.AddMvc() .AddJsonOptions( options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore );

这个方法主要是为了防止无线循环引用,如果你想改变返回的格式json,你可以尝试下面的解决方法,选择你想要的数据

var data= _context.Users
                .Include(user => user.UserRoles)
                    .ThenInclude(ur => ur.Role)
                    .Where(ro => ro.UserRoles.Any(i => i.RoleId == roleId))
                    .Select(u=>new {
                        name=u.UserName,
                        userRoles=u.UserRoles.Select(ur=>new {
                            roleId=ur.RoleId,
                            role=ur.Role.RoleName

                        })
                    })
                    .ToList();