【问题标题】:Linq adding items to list in the queryLinq在查询中添加项目到列表
【发布时间】:2022-10-12 21:18:27
【问题描述】:

再会, 我有一个问题。我有三个域对象

 public class User
{
    public Guid Id { get; set; }
    public string Username { get; set; }
    public string EmailAddress { get; set; }
    public string Password { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    [NotMapped]
    public List<string> Roles { get; set; }

    //nav prop
    public List<User_Role> UserRoles { get; set; }
}

 public class User_Role
{
    public Guid Id { get; set; }

    public Guid UserId { get; set; }
    //nav prop
    public User User { get; set; }

    public Guid RoleId { get; set; }
    //nav prop
    public Role Role { get; set; }
}
 public class Role
{
    public Guid Id { get; set; }
    public string Name { get; set; }

    public List<User_Role> UserRoles { get; set; }
}

我想从他们创建 DTO 对象

 public class ReturnUserDto
{
    public Guid Id { get; set; }
    public string Username { get; set; }
    public string EmailAddress { get; set; }
    public string Password { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public List<string> Roles { get; set; }
}

我为它创建了一个控制器

[Route("api/[controller]")]
[ApiController]
public class UserController : ControllerBase
{
    public readonly IUserRepository _userRepository;
    public readonly IRoleRepository _roleRepository;
    public readonly IUserRoleRepository _userRoleRepository

    public UserController(IUserRepository userRepository, IRoleRepository IRoleRepository,
        IUserRoleRepository userRoleRepository)
    {
        _userRepository = userRepository;
        _roleRepository = IRoleRepository;
        _userRoleRepository = userRoleRepository;   
    }

    [HttpGet]
    public async Task<IActionResult> GetAllUsersAsync()
    {
        var users = _userRepository.GetAllAsync();

        var usersDto = users.ConvertToDto(unknow arguments)


    }
}

我正在尝试通过使用静态 DtoConverstion 函数来实现它 看起来像这样

public static IEnumerable<ReturnUserDto> ConvertToDto(this IEnumerable<User> users,
        IEnumerable<Role>  Role)
    {
        var  returnUserDto = (from user in users
                              select new ReturnUserDto
                              {
                                  Id = user.Id,
                                  Username = user.Username,
                                  EmailAddress = user.EmailAddress,
                                  Password = user.Password,
                                  FirstName = user.FirstName,
                                  LastName = user.LastName,
                                  Roles = ?(Something like Role.name)
                              })
    }

我如何实现它?我知道我需要使用 user_roles 从中获取特定用户的角色,然后将其添加到 DtoConvertion 函数。我只是不知道该怎么做。

【问题讨论】:

    标签: linq dto


    【解决方案1】:

    可以通过多种方式进行

    1. 传入用户角色的值,并在转换方法中使用它来处理
          ...
          var users = _userRepository.GetAllAsync();
          var userRoles = _userRoleRepository.GetAllAsync();
      
          var usersDto = users.ConvertToDto(userRoles)
          ...
      
      
          public static IEnumerable<ReturnUserDto> ConvertToDto(this IEnumerable<User> users,
              IEnumerable<UserRole> userRoles)
          {
              var  returnUserDto = (from user in users
                                    select new ReturnUserDto
                                    {
                                        Id = user.Id,
                                        Username = user.Username,
                                        EmailAddress = user.EmailAddress,
                                        Password = user.Password,
                                        FirstName = user.FirstName,
                                        LastName = user.LastName,
                                        Roles = userRoles.Where(s => s.UserId == user.Id).ToList
                                    })
          }
      
      1. 在 EF 中使用 Include() 方法方法来获取 UserRole 的值以及用户,同时获取并将其转换为 DTO。与第一种方法相比,这只需要一次数据库调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      相关资源
      最近更新 更多