短小精悍的左连接和映射查询

dapper left join & mapping query

Brand 和 Campaign 实体之间存在一对多关系,

有了给定的 ID,我需要 select 广告系列和相关的品牌实体。 为此:

     public async Task<Campaign> GetAsync(int id)
        {
            using var dbConnection = _context.CreateConnection();
            string query = @"SELECT c.[Id], c.[BrandId], c.[StartDate], 
            c.[EndDate],b.[Id] FROM [dbo].[Campaign] c
                            left join [dbo].[Brand] b on c.[BrandId] = b.[Id]
                            WHERE c.[Id] = @Id";
            var campaign = await dbConnection.QueryAsync<Campaign, Brand, Campaign>(query, (campaign, brand) =>
            {
                campaign.Brand = brand;

                return campaign;
            }, splitOn: "BrandId", param: new { Id = id });
            return campaign.FirstOrDefault();
        }

上面的代码没有抛出异常,但是子品牌实体不正确。(它的虚拟记录,BrandId 是 0 而它在数据库中的值是 5)

这里缺少什么?

实体定义:

   public class Campaign : SqlEntityBase
    {
        public int BrandId { get; set; }
        public DateTime? StartDate { get; set; }
        public DateTime? EndDate { get; set; }
        public Brand Brand { get; set; }
    }

 public class Brand : SqlEntityBase
    {
        public string Name { get; set; }
        public List<Campaign> Campaign { get; set; } = new List<Campaign>();
    }

您的 SQL 查询没有意义。您在 BrandId 中拆分 BrandId,但您从未 select 与查询中的品牌有任何关系。使用您当前的代码,dapper 正在将 SQL 列 Id 解析为您的 Campaign POCO(它不能这样做,因为没有 属性 称为 Id,您也没有任何东西在活动 class) 中映射到它。

然后它看到 BrandId 然后将之后的所有内容解析到 Brand POCO 中,但是您 selecting 的其余列是开始和结束日期活动。

总结:您需要将品牌数据包含到 SQL 查询中。您正在加入 table,但仅 select 正在查看活动数据。