Dapper Many-to-Many Query

asp.net-mvc-4 dapper

Pregunta

Intento escribir una consulta para obtener un usuario en el sistema con todos sus roles. Hay una relación muchos a muchos entre usuarios y roles. La tabla de SystemUserUserRole es SystemUserUserRole con columnas UserId y RoleId . Mis modelos están abajo:

Modelo del usuario del sistema

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

Modelo UserRole

[Key]
public int RoleId { get; set; }

[Required]
[MaxLength(250)]
public string RoleName { get; set; }

public virtual List<SystemUser> SystemUsers { get; set; }

Estoy tratando de hacer algo a continuación sin suerte. Cualquier sugerencia sobre lo que estoy haciendo mal.

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();

Respuesta popular

Esto funcionará:

En la clase SystemUser, agregue un constructor que inicialice la lista:

public SystemUser()
{
    UserRoles = new List<UserRole>();
}

Luego, indique a Dapper que para cada fila unida, la UserRole se debe agregar a SystemUser.UserRoles:

SystemUser user = con.Query<SystemUser, UserRole, SystemUser>(query,
    (SystemUser, UserRole) =>
    {
        SystemUser.UserRoles.Add(UserRole);
        return SystemUser;
    },
    splitOn: "RoleId").First();

Tenga en cuenta que la última pieza está agregando el parámetro splitOn , porque Dapper espera que las columnas de identidad se denominen Id ; de lo contrario, debe indicarle explícitamente el nombre de la columna.



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é