Ich habe 2 Entitätsklassen:
public class PostTag
{
public int Id { get; set; }
public string Alias { get; set; }
public string Name { get; set; }
public int Level { get; set; }
}
public class PostTagIndex
{
public int Id { get; set; }
public int PostTagId { get; set; }
}
Ich möchte darauf aufmerksam machen, dass beide das gleiche Feld namens "Id" haben.
Als nächstes benutze ich die Methode Query (...) wie folgt:
List<PostTag> postTags
= cn.Query<PostTag>(postTagsSql, new { postId }).AsList();
Hier ist das generierte SQL:
exec sp_executesql N'
SELECT *
FROM [PostTags] AS pt
JOIN [PostTagIndexes] AS pti
ON pt.[Id] = pti.[PostTagId]
WHERE ([PostId] = @postId)',N'@postId int',@postId=3035
Und hier ist das Ergebnis:
Id Alias Name Level Id PostId PostTagId
1014 name1 Name1 0 2020 3035 1014
2014 name2 Name2 1 3021 3035 2014
Daher enthält das Ergebnis zwei 'Id'-Spalten, da alle Spalten zusammengefügt und ausgewählt werden.
Ich erwarte, dass die Id-Werte der ersten Spalte in die PostTag.Id eingegeben werden. Ist das nicht logisch? Aber in der Tat, es dauert die zweite 'Id' Spalte als PostTags 'IDs. Natürlich kann ich SELECT pt.*
Anstatt nur SELECT *
schreiben, aber warum braucht es nicht den allerersten passenden Spaltennamen, anstatt ihn zu überspringen?
Ich glaube nicht, dass die erste ID übersprungen wird. Ich vermute, dass es von Sekunde an überschrieben wird.
Also, Dapper Mapper Modul startet das Mapping. Es findet die erste ID-Spalte. Es bildet es korrekt ab. Dann werden auch andere Spalten abgebildet. Dann findet es wieder die ID-Spalte und bildet sie wieder korrekt ab.
Wie ich oben sagte, ist das was ich vermute. Vielleicht möchten Sie sich Dapper-Quellcode ansehen, um sicherzugehen.
Wie Sie in Ihrer Frage gesagt haben, ist SELECT pt.*
Eine Lösung. Andere können unterschiedliche Alias für pti.ID AS PTI_ID
oder so etwas sein.
Der Datentyp wird auch beim Mapping berücksichtigt. Aber das kann man nicht ändern, denke ich.
In diesem Beitrag wird das Zuordnen doppelter Spalten behandelt, wenn einer von ihnen null
.
In diesem Fall benutzt du Dapper falsch, fürchte ich. Ihr SQL gibt 2 Spalten im Wert von Entitäten zurück, aber Sie bitten Dapper, nur einem von ihnen zuzuordnen.
Sie sollten entweder die Abfrage mit mehreren Zuordnungen verwenden oder nur die Spalten auswählen, die für die PostTag-Entität benötigt werden.