Dapper多映射错误一对多查询

问题描述 投票:0回答:1

我正在使用 Dapper 在我的应用程序中执行许多查询。目前,我在对一对多关系中的两个表执行查询时遇到错误。我收到此错误:

多地图错误:未找到 splitOn 列“PortalId”

这是我的询问

public async Task<Result<PortalResponse?, Error>> Handle(GetEmailAddressesQuery request, CancellationToken cancellationToken)
{
    var parameters = new DynamicParameters();
    parameters.Add("@p_tenantid", request.TenantId);

    const string sql = """
        SELECT em.PortalId, em.Email
        FROM dbo.Portal p 
        JOIN dbo.PortalEmailAddress em ON p.Id = em.PortalId
        WHERE p.TenantId = @p_tenantid
    """;

    using var connection = _dapperContext.CreateConnection();

    var response = await connection.QueryAsync<PortalResponse, EmailAddressResponse, PortalResponse>
        (new CommandDefinition(sql, parameters, cancellationToken: cancellationToken),
          (portal, emailAddress) =>
          {
              portal.EmailAddresses.Add(emailAddress);
              return portal;
          }, splitOn: "PortalId");

    if (response is null)
    {
        return PortalErrors.PortalNotFound(request.TenantId);
    }

    return response.FirstOrDefault();
}

这些是我的回应课程

public sealed class PortalResponse : IResponse
{
    public int Id { get; init; }
    public string Name { get; init; } = string.Empty;
    public List<EmailAddressResponse> EmailAddresses { get; set; } = [];
    public List<PhoneNumberResponse> PhoneNumbers { get; set; } = [];
    public AddressResponse? Address { get; set; }
    public string? WelcomeMessage { get; init; }
    public string? Logo { get; init; };
}

public sealed class EmailAddressResponse
{
    public int PortalId { get; init; }
    public string Email { get; init; } = string.Empty;
}

我以为我的设置是正确的,但可惜我没有。任何帮助表示赞赏。

asp.net-core dapper
1个回答
0
投票

您需要更改查询以添加 Portal 类中的字段。否则,没有字段可以拆分并创建 QueryAsync 中指定的两个类实例。

const string sql = @"
    SELECT p.Id, p.Name, em.PortalId, em.Email
    FROM dbo.Portal p 
    JOIN dbo.PortalEmailAddress em ON p.Id = em.PortalId
    WHERE p.TenantId = @p_tenantid";

当然,您还可以添加 Portal 类中映射到数据库列的其他字段。

© www.soinside.com 2019 - 2024. All rights reserved.