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

时间:2019-08-09 16:09:51

标签: entity-framework-core asp.net-core-2.0

我不确定自己做错了还是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:''                
        }
    }
    ]
  }
]

1 个答案:

答案 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();