使用 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.Permiso
和 per.Rol
的情况为您执行连接。由于匿名类型的 PermisoEnRol 属性 具有在匿名类型
上重复的 Permiso 和 Rol 属性,因此它使图表略显混乱
请注意,这会将您的数据库实体暴露给调用者;通常我们会有一些其他对象供前端使用并将数据库实体映射到它
我是使用 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.Permiso
和 per.Rol
的情况为您执行连接。由于匿名类型的 PermisoEnRol 属性 具有在匿名类型
请注意,这会将您的数据库实体暴露给调用者;通常我们会有一些其他对象供前端使用并将数据库实体映射到它