Problème de Dapper Multi-mapping

dapper

Question

Continuez à courir dans "Lors de l'utilisation des API multi-mapping, assurez-vous de définir le paramètre splitOn si vous avez des clés autres que Id" pour le bloc de code ci-dessous:

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();

J'utilise SplitAccount et SplitBranch pour splitOn comme solution de contournement.

Em je manque quelque chose?

Merci

Modifier:

J'ai un peu nettoyé mon test, voici une version allégée des classes et une nouvelle requête:

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();

Réponse acceptée

Après quelques heures de débogage du code source de Dapper, j'ai finalement trouvé le problème et c'est assez intéressant.

Lorsque plusieurs champs splitOn sont fournis, Dapper effectue un fractionnement basé sur une virgule, par exemple var splits = splitOn.Split (','). ToArray (). Ensuite, il parcourt tous les champs de l'ensemble d'enregistrements et les divise en objets basés sur le tableau ci-dessus; joli détroit en avant.

Maintenant, la partie amusante: Lorsque j'ai fourni mes champs splitOn, j'ai eu un espace supplémentaire après la virgule, par exemple «CompteCompte, BrancheId» et ce petit espace était la cause. Après Split (), le champ BranchId contenait un espace supplémentaire et ne correspondait à aucun champ du jeu d'enregistrements.

Il y a deux façons de contourner cela:

  1. N'utilisez pas d'espaces supplémentaires après les virgules; auquel je suis personnellement accro; une vieille habitude de SQL.
  2. Modifiez la méthode GenerateDeserializers de Dapper et modifiez: var currentSplit = divise [splitIndex] en var currentSplit = splits [splitIndex] .Trim (), ou quelque chose de similaire; c'est ce que j'ai fait pour ma copie locale.

Voici l'instantané du code:

    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++;
            }

Mettre à jour:

Le correctif ci-dessus a été fusionné: https://github.com/SamSaffron/dapper-dot-net/commit/399db17e5aa6f1eefaf8fdccff827020be8e6cbb




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi