Dapper多对多查询

And*_*rew 6 dapper asp.net-mvc-4

我正在尝试编写一个查询来让系统中的用户拥有他/她的所有角色.用户和角色之间存在多对多关系.木匠表是SystemUserUserRoleUserIdRoleId.我的模型如下:

SystemUser模型

[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; }
Run Code Online (Sandbox Code Playgroud)

UserRole模型

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

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

public virtual List<SystemUser> SystemUsers { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

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();
Run Code Online (Sandbox Code Playgroud)

pet*_*ven 7

这将有效:

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

public SystemUser()
{
    UserRoles = new List<UserRole>();
}
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,最后一部分是添加splitOn参数,因为Dapper期望命名标识列Id,否则您需要明确地告诉它列名.


And*_*rew 0

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

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

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

然后我从连接器表中获取 RoleId:

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

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

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