Dapper Query错误地映射实体ID

时间:2018-04-01 19:14:34

标签: join dapper

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

2 个答案:

答案 0 :(得分:1)

在这种情况下,你恐怕错误地使用了Dapper。您的SQL返回2个实体值列,但您要求Dapper只映射其中一个。

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

答案 1 :(得分:0)

我认为没有跳过第一个ID。我怀疑它被第二次覆盖了。

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

正如我上面所说,这是我怀疑的。您可能需要查看Dapper源代码以确保。

正如您在问题中所说,SELECT pt.*是一种解决方案。其他可能是为pti.ID AS PTI_ID使用不同的别名。

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

post讨论了当其中一个列为null时重复列的映射。