我的应用程序使用ASP.NET Identity 2和存储在SQL Server 2012关系表中的表。以下是我想用于报告的两个类的视图:
public partial class AspNetUser
{
public AspNetUser()
{
this.AspNetRoles = new List<AspNetRole>();
}
public string Id { get; set; }
public string UserName { get; set; }
public virtual ICollection<AspNetRole> AspNetRoles { get; set; }
}
public partial class AspNetRole
{
public AspNetRole()
{
this.AspNetUsers = new List<AspNetUser>();
}
public string Id { get; set; }
public string Name { get; set; }
public virtual ICollection<AspNetUser> AspNetUsers { get; set; }
}
我创建了以下LINQ来给我一个报告:
var users = await db.AspNetUsers
.Include(u => u.AspNetRoles)
.ToListAsync();
这是在WebAPI方法中,当我检查结果时,它给了我一个 结果,我不指望。我看到的是一组用户对象和 然后在那个角色里面。但是在角色阵列里面是 另一组用户!
这是我看到的输出,其中省略了一些字段以显示它 容易:
[{"id":"27cd003a-fb6a-4a2d-8df9-f502bc10a583"
"aspNetRoles":[
{
"id":"53724f55-af7a-448b-9ae2-1fe295b109fd",
"name":"Admin",
"aspNetUsers":[
{
"id":"527ddbd5-14d3-4fb9-a7ae-374e66f635d4",
"aspNetRoles":[]
},
{
"id":"e87c05bc-8305-45d0-ba07-3dd24438ba8b",
"aspNetRoles":[]
}
]},
{"id":"527ddbd5-14d3-4fb9-a7ae-374e66f635d4",
如何更改LINq,以便它为AspNetUser
个对象提供一个简单的AspNetRole
对象数组?即使他们没有角色,我也需要查询向我显示用户。像这样:
User1
Role1
Role2
User2
Role1
User3
User4
Role2
答案 0 :(得分:1)
正如您所说,您无法控制域类 - 它们属于Microsoft。所以,你真正说的是你不想直接将你的域名对象暴露给世界其他地方(google那个,你会发现各种各样的人对这个主题有意见)。因此,一个选项是定义一组类,这些类是您要公开的类(数据交换类)。类似的东西:
public class User
{
public string Id { get; set; }
public string UserName { get; set; }
public virtual List<Role> Roles { get; set; }
}
public class Role
{
public string Id { get; set; }
public string Name { get; set; }
}
然后,当您获取域对象时,将它们映射到数据交换对象中以进行序列化并暴露给世界其他地方。