Ich versuche, eine Abfrage zu schreiben, um einen Benutzer mit all seinen Rollen in das System zu bekommen. Es besteht eine Viele-zu-Viele-Beziehung zwischen Benutzern und Rollen. Die Joiner-Tabelle ist SystemUserUserRole
mit den Spalten UserId
und RoleId
. Meine Modelle sind unten:
Systembenutzermodell
[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; }
UserRole-Modell
[Key]
public int RoleId { get; set; }
[Required]
[MaxLength(250)]
public string RoleName { get; set; }
public virtual List<SystemUser> SystemUsers { get; set; }
Ich versuche unten etwas zu tun, ohne Glück. Irgendwelche Vorschläge, was ich falsch mache.
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();
Das wird funktionieren:
Fügen Sie in der SystemUser-Klasse einen Konstruktor hinzu, der die Liste initialisiert:
public SystemUser()
{
UserRoles = new List<UserRole>();
}
Dann sagen Sie Dapper, dass für jede verbundene Zeile die UserRole dem SystemUser.UserRoles hinzugefügt werden sollte:
SystemUser user = con.Query<SystemUser, UserRole, SystemUser>(query,
(SystemUser, UserRole) =>
{
SystemUser.UserRoles.Add(UserRole);
return SystemUser;
},
splitOn: "RoleId").First();
Beachten Sie, dass das letzte Stück den splitOn
Parameter hinzufügt, da Dapper erwartet, dass Identitätsspalten den Namen Id
, andernfalls müssen Sie den Spaltennamen explizit splitOn
.