外部联接和精致的

时间:2017-11-02 23:49:34

标签: c# mysql many-to-many dapper outer-join

我有三张桌子

  • 用户(id, firstname, lastname)
  • 模块(id, name)
  • Users_modules (id, u_id, m_id, secret, token)(多对多。代表授权用户的模块)

为特定用户提供以下数据的查询是什么:

  • 用户(id, firstname, lastname)
  • 来自users_modules的授权模块(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),然后获取所有模块,最后在我的业务层手动执行减法。我知道有一种更聪明的方法可以做到,但要找出来。

2 个答案:

答案 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