如何使用 EF Core LINQ 将多对多查询转换为 DTO?

问题描述 投票:0回答:1

我有两个表(由

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();
}
c# linq asp.net-core entity-framework-core
1个回答
0
投票

最简单且基本上最快的方法是使用

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.