gpt4 book ai didi

c# - 具有外连接且简洁的多对多

转载 作者:行者123 更新时间:2023-11-29 18:15:14 24 4
gpt4 key购买 nike

我有三张 table

  • 用户(id、名字、姓氏)
  • 模块(id,名称)
  • Users_modules (id, u_id, m_id, Secret, token)(多对多。表示已授权给用户的模块)

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

  • 用户(id、名字、姓氏)
  • 来自 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 的授权和未授权模块列表属性

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;
}
}

我必须首先获取用户的授权模块(使用简洁的多重映射),然后获取所有模块,最后在我的业务层手动进行减法。我知道有一种更聪明的方法可以做到这一点,但尚未找到。

最佳答案

您几乎已经解决了问题,但是您错过了一件事,如果用户没有与模块的连接,则左侧为“模块”的左外连接不会产生任何结果。要解决此问题,您只需更改左外连接的“左”侧或将其切换为右外连接:

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

关于c# - 具有外连接且简洁的多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47086377/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com