C# 使用实体框架核心查询多对多相关数据

C# 使用实体框架核心查询多对多相关数据,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我有两个具有多对多关系的实体。我还有一个实体,在这两者之间保存着两个ID。我只想加载两个主要实体 我的实体: public class User { public long Id { get; set; } public string Email { get; set; } public virtual ICollection<UserRole> UserRoles { get; set; } } public class Role { publ

我有两个具有多对多关系的实体。我还有一个实体,在这两者之间保存着两个ID。我只想加载两个主要实体

我的实体:

public class User 
{
    public long Id { get; set; }
    public string Email { get; set; }
    public virtual ICollection<UserRole> UserRoles { get; set; }
}

public class Role 
{
    public long Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<UserRole> UserRoles { get; set; }
}

public class UserRole 
{
    public long UserId { get; set; }
    public User User { get; set; }
    public long RoleId { get; set; }
    public Role Role { get; set; }
}

EF Core在技术上不支持M2M关系。您可以通过一个连接关系双方的“连接”实体来伪造上述支持,就像您在这里使用的
UserRole
一样。不幸的是,这是无法避免的,因此,如果您不想在结果中看到
UserRole
关系,则必须手动重塑数据。例如:

var users = await _context.Users.Select(u => new
{
    Email = u.Email,
    Roles = u.UserRoles.Select(r => r.Role)
}).ToListAsync();

专业提示:如果要从关系中进行选择,则不需要
包含
。EF Core足够聪明,可以发布连接以填充数据。

通常不会,因为这只是一种关系。如果关系不再存在,则将其删除。如果有新的关系,你就添加它。
var users = await _context.Users.Select(u => new
{
    Email = u.Email,
    Roles = u.UserRoles.Select(r => r.Role)
}).ToListAsync();