我有三张桌子
(id, firstname, lastname)
(id, name)
(id, u_id, m_id, secret, token)
(多对多。代表授权用户的模块)为特定用户提供以下数据的查询是什么:
(id, firstname, lastname)
(id, 1 as isAuthorized)
(id, 0 as isAuthorized)
外连接模块为了我,无法弄清楚这一点。 这是我的尝试:
Select u.firstName, u.lastName, u.id, m.id,m.name
From modules m
Left Outer Join users_modules uc On uc.m_id = m.id
Left Outer Join users u On
u.id = uc.u_id And
u.id = 120
然后我想使用dapper将结果映射回我的User
类,以便user
对象在modules
列表属性中将所有Modules
授权和未授权
public class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public List<Module> Modules{ get; set; }
public User()
{
Modules= new List<Module>();
}
}
[Table("modules")]
public class Module
{
public int Id { get; set; }
public string Name { get; set; }
public string AuthorizationBaseUri { get; set; }
public bool IsAuthorized { get; set; }
public string LoginUrl { get; set; }
public Module()
{
LoginUrl = string.Empty;
AuthorizationBaseUri = string.Empty;
IsAuthorized = false;
}
}
我必须首先获得用户的授权模块(使用dapper multiple mapping),然后获取所有模块,最后在我的业务层手动执行减法。我知道有一种更聪明的方法可以做到,但要找出来。
答案 0 :(得分:0)
你几乎解决了这个问题,但是你错过了一件事,如果用户没有连接到模块,左边的外连接是左边的&#34;模块&#34;不会导致任何结果。要解决这个问题,你只需要更改&#34;左边&#34;左外连接的一侧或切换为右外连接:
Select u.firstName, u.lastName, u.id, m.id,m.name
From users u
Left Outer Join users_modules uc On uc.u_id = u.id
Left Outer Join modules m On m.id = uc.m_id
where u.id = 120 and uc.u_id = 120
答案 1 :(得分:0)
试试这个:
select u_m.id,firstname,lastname,m_id, secret, token,name from
(select u.id,firstname,lastname,m_id, secret, token from
(select id, firstname, lastname from users where id = 120) as u
left join
(select id, u_id, m_id, secret, token from users_modules) as um
on u.id = um.u_id) as u_m
left join
(select id,name from modules) as m
on m.id = u_m.m_id