Muchos a muchos con unión externa y dapper

c# dapper many-to-many mysql outer-join

Pregunta

Tengo tres tablas

  • Usuarios (id, firstname, lastname)
  • Módulos (id, name)
  • Users_modules (id, u_id, m_id, secret, token) (many-to-many. Representa módulos que están autorizados para los usuarios)

¿Cuál sería la consulta para obtener la siguiente información para un usuario específico?

  • Usuario (id, firstname, lastname)
  • Módulos autorizados (id, 1 as isAuthorized) de users_modules
  • Módulos no autorizados (id, 0 as isAuthorized) combinación externa con módulos

por el bien de mí, no pude resolver esto. Este es mi intento:

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

Luego quiero asignar los resultados a mi clase de User utilizando dapper para que user objeto del user tenga todos los modules autorizados y no autorizados en la propiedad Lista de 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;
        }
    }

Primero tuve que obtener los módulos autorizados para el usuario (usando el mapeo múltiple de dapper), luego obtener todos los módulos, y finalmente hacer la resta manualmente en mi capa de negocios. Sé que hay una manera más inteligente de hacerlo, pero aún no lo sé.

Respuesta popular

Prueba esto:

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué