我有两个表(由
ef core scaffold
自动生成):
public partial class Role : IEntityWithDTO<ClientRoleDTO>
{
public Guid Id { get; set; }
public string Name { get; set; } = null!;
public virtual ICollection<User> Users { get; set; } = new List<User>();
}
public partial class User : IEntityWithDTO<UserDTO>
{
public Guid Id { get; set; }
public string Login { get; set; } = null!;
public string Pass { get; set; } = null!;
public virtual ICollection<Role > Roles { get; set; } = new List<Role>();
}
还有
UserDTO
,看起来像这样:
public class UserDTO: IDTO
{
public required Guid Id { get; set; }
public required string Login { get; set; }
public List<string>? Roles { get; set; }
}
如何进行查询以返回
UserDTO
以及 Role
名称列表?
当写下以下内容时,我仅成功获得了
User
以及 Role
列表作为对象:
[HttpGet]
[Route("/user")]
public async Task<IActionResult> GetUserAsync([FromQuery] Guid userId)
{
using var dbContext = new DatabaseContext();
var user = await dbContext.Users
.Where(user => user.Id == userId)
.Include(user => user.Roles)
.FirstOrDefaultAsync();
if (group is not null)
return Ok(user);
else
return NotFound();
}
最简单且基本上最快的方法是使用
Select
。请注意,使用 Select
,您可以省略 Include
,它仍然有效。
[HttpGet]
[Route("/user")]
public async Task<IActionResult> GetUserAsync([FromQuery] Guid userId)
{
using var dbContext = new DatabaseContext();
var user = await dbContext.Users
.Where(user => user.Id == userId)
.Select(user => new UserDTO
{
Id = user.Id,
Login = user.Login,
Roles = user.Roles.Select(r => r.Name).ToList()
})
.FirstOrDefaultAsync();
if (user is not null)
return Ok(user);
else
return NotFound();
}