Join Dapper查询错误地映射了实体ID

Join Dapper查询错误地映射了实体ID,join,dapper,Join,Dapper,我有两个实体类: 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 in

我有两个实体类:

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();
结果如下:

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*
,但无论如何,为什么不使用第一个合适的列名而不是跳过它呢?

我不认为第一个ID被跳过。我怀疑这是第二次写得太多了

因此,Dapper mapper模块启动映射。它将查找第一个ID列。它正确地映射了它。然后它还映射其他列。然后,它再次找到ID列并将其正确映射

正如我上面所说,这是我所怀疑的。您可能想看看简洁的源代码,以确保

正如您在问题中所说,
SELECT pt.
是一种解决方案。另一种可能是将
pti.ID的不同别名用作pti\u ID
或其他内容

映射时也会考虑数据类型。但我想这是你无法改变的


本文讨论了当其中一个列为
null

时映射重复列的问题。在这种情况下,恐怕您不正确地使用了Dapper。您的SQL返回了相当于两个实体的列,但您要求Dapper只映射到其中一个


您应该使用多重映射查询,或者只选择PostTag实体所需的列

我想你是对的,它映射了
Id
两次。我添加了一个pull请求并进行了修复,但它破坏了一些测试:@Sergey:我个人认为Dapper的工作方式是正确的
Distinct()。
(在github上修改)将从多个字段中提取一个字段。但这将带来更多的麻烦,而不是解决方案。选择了哪个字段?为什么?为什么不是其他的呢?“如果和但是太多了。@谢尔盖:我能想象的更好的解决方案是,如果发现重复的列名,Dapper应该抛出一个异常。这样,用户就可以提前知道发生了什么错误。然后,用户可以针对给定的情况以任何最佳方式更正代码。我同意任何比安静地设置错误值更好的解决方案。
Id      Alias   Name    Level   Id      PostId  PostTagId
1014    name1   Name1   0       2020    3035    1014
2014    name2   Name2   1       3021    3035    2014