【问题标题】:Dapper nested object with COUNT always returns 0具有 COUNT 的 Dapper 嵌套对象始终返回 0
【发布时间】:2021-03-05 16:13:01
【问题描述】:

我正在尝试使用 Dapper 和 postgres 执行以下操作。

我得到了所有图像,每个模型的 cmets 都嵌套在里面,但总票数始终为 0。我认为这是 Dapper 中的映射,就好像我在 PGAdmin 中手动运行 SQL 一样,它会正确返回。

型号:

public class Image
{
    public int Id { get; set; }
    public string Url { get; set; }
    public DateTime DateTaken { get; set; }
    public virtual List<Comment> Comments { get; set; }
    public int VoteTotal { get; set; }
}    

我的回购代码:

string sql = $"SELECT i.*, c.*, count(v.id) as votetotal " +
             $"FROM image i " +
             $"INNER JOIN comment c ON i.id = c.imageid " +
             $"INNER JOIN vote v ON i.id = v.imageid " +
             $"group by i.id, c.id;";

var lookup = new Dictionary<int, Image>();

connection.Query<Image, Comment, Image>(sql, (i, c) =>
{
    if (!lookup.TryGetValue(i.Id, out Image image))
    {
        lookup.Add(i.Id, image = i);
    }
    if (image.Comments == null) image.Comments = new List<Comment>();                                
    image.Comments.Add(c);                                
    return image;
}).AsQueryable();

json:

[
{
    "id": 1,
    "url": "google.com/animage",
    "dateTaken": "2000-01-01T00:00:00",
    "comments": [
        {
            "id": 5,
            "imageId": 1,
            "commentText": "two comment",
            "createdBy": "Sam",
            "createdOn": "2021-03-05T13:39:21.065"
        },
        {
            "id": 4,
            "imageId": 1,
            "commentText": "one comment",
            "createdBy": "Pam",
            "createdOn": "2021-03-05T13:39:21.065"
        }
    ],
    "voteTotal": 0
}
]

【问题讨论】:

  • dapper 映射不区分大小写吗?你有 public int VoteTotal { get; set; }count(v.id) as votetotal
  • 我是这么想的,但不幸的是没有解决这个问题
  • 结束了 QueryMultiple 路线,效果更好。

标签: c# json postgresql asp.net-core dapper


【解决方案1】:

VoteTotal 应该进入第一个映射,因为你已经在 Image。当 Comment 已经被映射时,它是 SQL 中的最后一个,所以它不会被映射。您应该将 SQL 更改为:

string sql = @"SELECT count(v.id) as votetotal, i.*, c.*
               FROM image i INNER JOIN comment c ON i.id = c.imageid
               INNER JOIN vote v ON i.id = v.imageid
               GROUP BY i.id, c.id;";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多