短小精悍的左连接和映射查询
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 正在查看活动数据。
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 正在查看活动数据。