大まかなマルチマッピングの問題

dapper

質問

「マルチマッピングAPIを使用する場合は、以下のコードブロックでId以外のキーがある場合はsplitOnパラメータを設定してください」というエラーが発生することがあります。

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

SplitAccountとSplitBranchを回避策としてsplitOnに使用しています。

Em私は何かが不足している?

ありがとう

編集:

私は少し私のテストをきれいにした、クラスの軽いバージョンと新しいクエリです:

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

受け入れられた回答

Dapperのソースコードを数時間デバッグした後、私はついにこの問題を発見しました。それはかなり興味深いものです。

複数のsplitOnフィールドが指定されている場合、Dapperはコンマに基づいて分割を行います(例:var splits = splitOn.Split( '、')。ToArray()。次に、すべてのレコードセットフィールドをループし、上記の配列に基づいてオブジェクトに分割します。かなりストレートです。

今、面白い部分:splitOnフィールドを提供したときに、コンマの後に余分なスペースがあった、例えば、 "AccountId、BranchId"とそのスペースが原因でした。 Split()の後、BranchIdフィールドに余分なスペースが含まれ、レコードセット内のANYフィールドと一致しませんでした。

これには2つの方法があります。

  1. カンマの後に余分なスペースを使用しないでください。私は個人的にそれに耽っていました。 SQLからの古い習慣。
  2. DapperのGenerateDeserializersメソッドを変更して、次のように変更します。var currentSplit = var currentSplit = splitits [splitIndex] .Trim()などのように分割します。それが私のローカルコピーのためにしたものです。

ここにコードスナップショットがあります:

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

更新:

上記の修正がマージされました: https : //github.com/SamSaffron/dapper-dot-net/commit/399db17e5aa6f1eefaf8fdccff827020be8e6cbb



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ