我有2个实体类:
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; }
}
我想提请注意这两个事件都有一个名为'Id'的相同字段。
接下来,我以这种方式使用Query(...)方法:
List<PostTag> postTags
= cn.Query<PostTag>(postTagsSql, new { postId }).AsList();
这是生成的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
结果如下:
Id Alias Name Level Id PostId PostTagId
1014 name1 Name1 0 2020 3035 1014
2014 name2 Name2 1 3021 3035 2014
因此,结果有两个'Id'列,因为加入并选择了所有列。
我希望将第一列'Id'值放在PostTag.Id中。这不符合逻辑吗?但实际上,它需要第二个“Id”列作为PostTags的ID。当然,我可以写SELECT pt.*
而不仅仅是SELECT *
,但无论如何为什么不采用第一个合适的列名而不是跳过它?
答案 0 :(得分:1)
在这种情况下,你恐怕错误地使用了Dapper。您的SQL返回2个实体值列,但您要求Dapper只映射其中一个。
您应该使用多映射查询,或者只选择PostTag实体所需的那些列。
答案 1 :(得分:0)
我认为没有跳过第一个ID。我怀疑它被第二次覆盖了。
因此,Dapper映射器模块启动映射。它找到第一个ID列。它正确映射它。然后它还映射其他列。然后它再次找到ID列并再次将其正确映射。
正如我上面所说,这是我怀疑的。您可能需要查看Dapper源代码以确保。
正如您在问题中所说,SELECT pt.*
是一种解决方案。其他可能是为pti.ID AS PTI_ID
使用不同的别名。
映射时也考虑数据类型。但是我想这是你无法改变的。
此post讨论了当其中一个列为null
时重复列的映射。