使用 Entity framework 连接多个表的最佳方法是什么?

What is the best way to join multiple tables with Entity framework?

我是使用 ASP.NET Core 和 Entity Framework 进行 C# 开发的新手,而且我无法确定编写查询的正确位置。我读过在控制器中编写它们不是好的做法,但我以通用方式实现了 UoW 模式和存储库模式,所以我唯一能够加入多个 tables 的地方是角色控制器.

下面是 table 方案的图片

Table Schemes

每个 table

我有一个存储库

Solution Explorer

Rol 控制器

[Route("api/roles")]
[ApiController]
public class RolController : ControllerBase
{
    private readonly IMapper _mapper;
    private readonly IConfiguration _config;
    private readonly IUnitOfWork _unitOfWork;

    public RolController(IUnitOfWork unitOfWork,IMapper mapper, IConfiguration config)
    {
        _unitOfWork = unitOfWork;
        _mapper = mapper;
        _config = config;
    }

    [HttpGet("GetrolesCompletos")]
    public async Task<IActionResult> GetRolesCompletos()
    {
        IQueryable<Rol> rol = await _unitOfWork.Rol.GetAll();
        IQueryable<PermisoEnRol> permisosenrol = await _unitOfWork.PermisosEnRol.GetAll();
        IQueryable<Permiso> permiso = await _unitOfWork.Permiso.GetAll();
        var query = from r in rol
                    join pr in permisosenrol on r.IdRol equals pr.Idrol
                    join p in permiso on pr.IdPermiso equals p.IdPermiso
                    select new
                    {
                        rol = r,
                        permisosenrol = pr,
                        permiso = p
                    };
        var result = query.ToList();
        return Ok(result);
    }
}

它应该可以工作 like/you应该设置它以便您可以像这样工作:

  public async Task<IActionResult> GetRolesCompletos() => 
    context.PermisoEnRols.Select(per =>
      new { 
        PermisoEnRol = per,
        per.Permiso,
        per.Rol
      }
    .ToList();

就是这样; EF 将根据您在 Select 中使用相关实体 per.Permisoper.Rol 的情况为您执行连接。由于匿名类型的 PermisoEnRol 属性 具有在匿名类型

上重复的 Permiso 和 Rol 属性,因此它使图表略显混乱

请注意,这会将您的数据库实体暴露给调用者;通常我们会有一些其他对象供前端使用并将数据库实体映射到它