Dapper Multi-mapping Issue

dapper

Pregunta

Sigue encontrándote con "Al utilizar las API de mapeo múltiple, asegúrate de configurar el error splitOn param si tienes otras claves que no sean Id" para el siguiente bloque de código:

var accounts = DbConnection.Query<Account, Branch, Application, Account>(
            "select Accounts.*, SplitAccount = '', Branches.*, SplitBranch = '', Applications.*" +
            " from Accounts" +
            "    join Branches" +
            "       on Accounts.BranchId = Branches.BranchId" +
            "    join Applications" +
            "       on Accounts.ApplicationId = Applications.ApplicationId" +
            " where Accounts.AccountId <> 0",
            (account, branch, application) =>
                {
                    account.Branch = branch;
                    account.Application = application;
                    return account;
                }, splitOn : "SplitAccount, SplitBranch"
            ).AsQueryable();

Estoy usando SplitAccount y SplitBranch para splitOn como una solución alternativa.

Em me falta algo?

Gracias

Editar:

He limpiado mi prueba un poco, a continuación se muestra una versión ligera de las clases y una nueva consulta:

public class AccountLight
{
    public int AccountId { get; set; }
    public string AccountNumber { get; set; }
    public BranchLight Branch { get; set; }
    public ApplicationLight Application { get; set; }
}

public class BranchLight
{
    public int BranchId { get; set; }
    public string BranchNumber { get; set; }
}

public class ApplicationLight
{
    public int ApplicationId { get; set; }
    public string ApplicationCode { get; set; }
}

var accounts2 = DbConnection.Query<AccountLight, BranchLight, ApplicationLight, AccountLight>(
    "select Accounts.AccountId, Accounts.AccountNumber," +
    "       Branches.BranchId, Branches.BranchNumber," +
    "       Applications.ApplicationId, Applications.ApplicationCode" +
    " from Accounts" +
    "    inner join Branches" +
    "       on Accounts.BranchId = Branches.BranchId" +
    "    inner join Applications" +
    "       on Accounts.ApplicationId = Applications.ApplicationId" +
    " where Accounts.AccountId <> 0",
    (account, brach, application) =>
    {
        account.Branch = brach;
        account.Application = application;
        return account;
    }, 
    commandType: CommandType.Text,
    splitOn: "AccountId, BranchId"
    ).AsQueryable();

Respuesta aceptada

Después de algunas horas de depurar el código fuente de Dapper, finalmente encontré el problema y es bastante interesante.

Cuando se suministran múltiples campos splitOn, Dapper realiza una división basada en coma, por ejemplo var splits = splitOn.Split (','). ToArray (). A continuación, recorre todos los campos del conjunto de registros y los divide en objetos en función de la matriz anterior; bastante estrecho hacia adelante.

Ahora la parte divertida: cuando suministré mis campos splitOn, tenía un ESPACIO extra después de la coma, por ejemplo, "CountId, BranchId" y ese pequeño espacio era la causa. Después de Split (), el campo BranchId contenía un espacio adicional y no coincidía con CUALQUIER campo en el conjunto de registros.

Hay dos formas de evitar esto:

  1. No use espacios extra después de las comas; a lo cual yo personalmente fui adicto; un viejo hábito de SQL.
  2. Modifique el método GenerateDeserializers de Dapper y cambie: var currentSplit = splits [splitIndex] a var currentSplit = splits [splitIndex] .Trim (), o algo similar; eso es lo que hice para mi copia local.

Aquí hay una instantánea del código:

    private static Func<IDataReader, object>[] GenerateDeserializers(Type[] types, string splitOn, IDataReader reader)
    {
        int current = 0;
        var splits = splitOn.Split(',').ToArray();
        var splitIndex = 0;

        Func<Type, int> nextSplit = type =>
        {
            var currentSplit = splits[splitIndex].Trim();
            if (splits.Length > splitIndex + 1)
            {
                splitIndex++;
            }

Actualizar:

La solución anterior se fusionó: https://github.com/SamSaffron/dapper-dot-net/commit/399db17e5aa6f1eefaf8fdccff827020be8e6cbb



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué