我不确定自己做错了还是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:''
}
}
]
}
]
答案 0 :(得分:0)
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();