Dapper Many-to-Many Query

asp.net-mvc-4 dapper

Question

J'essaie d'écrire une requête pour qu'un utilisateur du système ait tous ses rôles. Il existe une relation plusieurs-à-plusieurs entre les utilisateurs et les rôles. La table de SystemUserUserRole est SystemUserUserRole avec les colonnes UserId et RoleId . Mes modèles sont ci-dessous:

SystemUser Model

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

Modèle UserRole

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

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

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

J'essaie de faire quelque chose ci-dessous sans succès. Toutes les suggestions sur ce que je fais 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();

Réponse populaire

Cela fonctionnera:

Dans la classe SystemUser, ajoutez un constructeur qui initialise la liste:

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

Dites ensuite à Dapper que pour chaque ligne jointe, le UserRole doit être ajouté à SystemUser.UserRoles:

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

Notez que le dernier élément consiste à ajouter le paramètre splitOn , car Dapper s'attend à ce que les colonnes d'identité soient nommées Id , sinon vous devez lui indiquer explicitement le nom de la colonne.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi