如何为多对多关系编写一个简单的LINQ报告?

本文关键字:简单 一个 LINQ 报告 关系 | 更新日期: 2023-09-27 18:06:48

我的应用程序使用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方法,当我检查结果,它给我一个结果出乎我意料。我看到的是一个用户对象数组然后在里面是一个角色数组。但是在Roles数组中是另一组用户!

下面是我看到的输出,其中有一些字段被提交以显示容易:

[{"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

如何为多对多关系编写一个简单的LINQ报告?

正如您所说,您无法控制域类——它们属于Microsoft。所以,你真正想说的是,你不想把你的领域对象直接暴露给世界上的其他人(谷歌一下,你会发现各种各样的人对这个主题有不同的看法)。因此,一种选择是定义一组要公开的类(数据交换类)。比如:

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; }
}

然后,当您获得域对象时,将它们映射到您的数据交换对象中,以便序列化并向世界其他地方公开。