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

C# 如何为多对多关系编写简单的LINQ报告?,c#,asp.net,asp.net-mvc,linq,asp.net-identity,C#,Asp.net,Asp.net Mvc,Linq,Asp.net Identity,我的应用程序将ASP.NET Identity 2与存储在SQL Server 2012关系表中的表一起使用。下面是我想用于报告的两个类的视图: public partial class AspNetUser { public AspNetUser() { this.AspNetRoles = new List<AspNetRole>(); } public string Id { get; set; } public stri

我的应用程序将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; }
}
这是在WebAPI方法中,当我检查结果时,它会给我一个 这是我没有预料到的结果。我看到的是一组用户对象和 然后在其中包含一系列角色。但在角色数组中 另一组用户

下面是我看到的输出,其中有一些字段用于显示 轻松:

如何更改LINq,使其提供一个
AspNetUser
对象数组和一个
AspNetRole
对象的简单数组?我还需要查询向我显示用户,即使他们没有角色。大概是这样的:

User1
   Role1
   Role2
User2
   Role1
User3
User4
   Role2

正如您所说,您无法控制域类--它们属于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; }
}
公共类用户
{
公共字符串Id{get;set;}
公共字符串用户名{get;set;}
公共虚拟列表角色{get;set;}
}
公共阶级角色
{
公共字符串Id{get;set;}
公共字符串名称{get;set;}
}

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

您有一个用户,其中包含一个角色列表,每个角色都包含一个用户列表,每个用户都包含一个角色列表。。。无限期。@Tom-这些不是我的课。它们是带有Identity2的Microsoft类。这是一种多对多的关系。我的问题是,在这种情况下,当我只需要用户>角色时,如何使LINQ不给我用户>角色>用户输出。感谢您可以尝试添加第三个“索引”类AspNetUserRole,该类派生自提供用户和角色之间映射的字典,然后删除其他两个类之间的耦合。似乎延迟加载会导致关系自动水合。要关闭它,请参见。生成的SQL是什么?
User1
   Role1
   Role2
User2
   Role1
User3
User4
   Role2
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; }
}