C# 使用实体框架核心查询多对多相关数据
我有两个具有多对多关系的实体。我还有一个实体,在这两者之间保存着两个ID。我只想加载两个主要实体 我的实体: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
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();