【问题标题】:Dapper Many-to-Many QueryDapper 多对多查询
【发布时间】:2019-05-22 15:15:45
【问题描述】:

我正在尝试编写一个查询来让系统中的用户拥有他/她的所有角色。用户和角色之间存在多对多的关系。连接器表是SystemUserUserRole,列有UserIdRoleId。我的模型如下:

系统用户模型

[Key]
public int UserId { get; set; }

[Required]
[MaxLength(75)]
public string FirstName { get; set; }

[Required]
[MaxLength(75)]
public string LastName { get; set; }

[Required]
[MaxLength(15)]
public string Phone { get; set; }

[Required]
[MaxLength(250)]
public string Email { get; set; }

public virtual List<UserRole> UserRoles { get; set; }

用户角色模型

[Key]
public int RoleId { get; set; }

[Required]
[MaxLength(250)]
public string RoleName { get; set; }

public virtual List<SystemUser> SystemUsers { get; set; }

我正在尝试在下面做一些没有运气的事情。关于我做错了什么的任何建议。

string query = "SELECT u.*, r.* FROM SystemUser u INNER JOIN SystemUserUserRole ur ON u.UserId = ur.UserId INNER JOIN UserRole r on ur.RoleId = r.RoleId WHERE Email = @email AND IsActive = true;";

SystemUser user = con.Query<SystemUser, UserRole, SystemUser>(query, (SystemUser, UserRole) => { SystemUser.UserRoles = UserRole; return SystemUser; }).First();

【问题讨论】:

    标签: asp.net-mvc-4 dapper


    【解决方案1】:

    这将起作用:

    在 SystemUser 类中,添加一个初始化列表的构造函数:

    public SystemUser()
    {
        UserRoles = new List<UserRole>();
    }
    

    然后告诉 Dapper 对于每个连接的行,应该将 UserRole 添加到 SystemUser.UserRoles:

    SystemUser user = con.Query<SystemUser, UserRole, SystemUser>(query,
        (SystemUser, UserRole) =>
        {
            SystemUser.UserRoles.Add(UserRole);
            return SystemUser;
        },
        splitOn: "RoleId").First();
    

    注意最后一块是添加splitOn参数,因为Dapper期望标识列被命名为Id,否则你需要明确地告诉它列名。

    【讨论】:

    【解决方案2】:

    这就是我最终做的事情......如果有更好的解决方案,请随时发表评论或发布更好的解决方案。

    我必须做三个单独的查询。我首先抓住了用户对象。

    SystemUser user = con.Query<SystemUser>("SELECT * FROM SystemUser WHERE Email = @email AND IsActive = true", new { email = email }).First();
    

    然后我从 joiner 表中获取 RoleId:

    IEnumerable<int> roleIds = con.Query<int>("SELECT RoleId FROM SystemUserUserRole WHERE UserId = @userId", new { userId = user.UserId });
    

    最后,我更新了用户对象并提取了与该用户关联的所有角色:

    user.UserRoles = con.Query<UserRole>("SELECT * FROM UserRole WHERE RoleID IN @roleIds", new { roleIds = roleIds }).ToList();
    

    【讨论】:

    【解决方案3】:

    你也可以试试这个对我有用:

    var result = con.Query<User, Role, User>(query, (u, r) => 
                        { 
                            u.UserRoles.Add(new UserRole{ User = u, Role=r }); 
                            return u; 
                        }, splitOn:"RoleId");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      相关资源
      最近更新 更多