And*_*rew 6 dapper asp.net-mvc-4
我正在尝试编写一个查询来让系统中的用户拥有他/她的所有角色.用户和角色之间存在多对多关系.木匠表是SystemUserUserRole列UserId和RoleId.我的模型如下:
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)
这将有效:
在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,否则您需要明确地告诉它列名.
这就是我最终所做的......如果有的话,请随意发表评论或发布更好的解决方案。
我必须做三个单独的查询。我首先抓住了用户对象。
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)
| 归档时间: |
|
| 查看次数: |
3255 次 |
| 最近记录: |