Ich habe zwei SQL-Tabellen: Teams und Mitglieder. Jedes Team enthält 3 Mitglieder. In der Datenbank werden die IDs der Mitglieder gespeichert.
Wie kann ich die Member-Objekte mit Dapper.NET ORM den Teams zuordnen?
public class Team
{
public int? id { get; set; }
public Member MemberA { get; set; }
public Member MemberB { get; set; }
public Member MemberC { get; set; }
}
public class Member
{
public int? id { get; set; }
public string Name { get; set; }
}
public IEnumerable<Team> GetTeams()
{
string sql = "SELECT * FROM Teams t LEFT JOIN Members m ON t.MemberA=m.id AND t.MemberB=m.id AND t.MemberC=m.id";
return m_connection.Query<Team, Member, Member, Member, Team>(sql, (t, m1, m2, m3) =>
{
t.MemberA = m1;
t.MemberB = m2;
t.MemberC = m3;
return t;
}, splitOn: "MemberA,MemberB,MemberC");
}
Sie müssen Ihre SQL-Abfrage korrigieren, um eine ordnungsgemäße Verknüpfung mit der Members-Tabelle zu erhalten.
Ändern Sie es einfach zu
string sql = @"SELECT t.ID, t.MemberA, m1.Id, m1.Name,
t.MemberB, m2.Id, m2.Name,
t.MemberC, m3.Id, m3.Name
FROM Teams t LEFT JOIN Members m1 ON t.MemberA=m1.id
LEFT JOIN Members m2 ON t.MemberB=m2.id
LEFT JOIN Members m3 ON t.MemberC=m3.id";
und Ihr Dapper-Code wird so funktionieren, wie Sie es erwarten, die drei Mitgliedsinstanzen jedes einzelnen abgerufenen Teams zu füllen.
Beachten Sie, dass Sie bei Verwendung von Multimapping die SplitOn-Elemente an der richtigen Stelle platzieren müssen, damit Dapper Ihre Anforderung zum Erstellen von drei verschiedenen Member-Variablen versteht.
Version für MS-Access
string sql = @"SELECT t.ID, t.MemberA, m1.Id, m1.[Name],
t.MemberB, m2.Id, m2.[Name],
t.MemberC, m3.Id, m3.[Name]
FROM (((Teams t LEFT JOIN Members m1 ON t.MemberA=m1.id)
LEFT JOIN Members m2 ON t.MemberB=m2.id)
LEFT JOIN Members m3 ON t.MemberC=m3.id)";