Dapper - 使用除Id之外的分割点的多重映射

时间:2011-10-20 14:23:02

标签: dapper

我知道这与Correct use of Multimapping in Dapper相似,但我认为它略有不同。

我有以下POCO结构:

public class Customer
{
    public int customerkey { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddress { get; set; }
    public List<Invoice> Invoices { get; set; }
    public int statekey { get; set; }
    public State State { get; set; }

    public Customer()
    {
        this.Invoices = new List<Invoice>();
    }
}

public class Invoice
{
    public int customerinvoicekey { get; set; }
    public int customerkey { get; set; }
    public int Number { get; set; }
    public string Description { get; set; }
    public int Total { get; set; }
    public int statuskey { get; set; }
    public State State { get; set; }
}

public class State
{   
    public int statekey { get; set; }
    public string Description { get; set; }
}

我正在尝试使用Dapper来映射它,而我没有使用Id作为我的分割点。如果我把钥匙加倍,我可以让它工作,但我不知道为什么我必须这样做。

为什么这样做:

const string commandText =
        @"SELECT 
        A.customerkey, A.FirstName, A.LastName, A.EmailAddress, A.statuskey,
        C.statuskey, C.Description,
        B.customerinvoicekey, B.customerkey, B.Number, B.Description, B.Total, B.statuskey,
        D.statuskey, D.Description
        FROM Web.TestCustomers2 A
        INNER JOIN Web.TestCustomerInvoices2 B ON A.customerkey = B.customerkey
        INNER JOIN Web.TestStatus2 C ON A.statuskey = C.statuskey
        INNER JOIN Web.TestStatus2 D ON B.statuskey = D.statuskey
        ORDER BY A.customerkey";

        var customers = new List<Customer>();
        Customer currentCustomer = null;
        db.Connection.Query<Customer, State, Invoice, State, Customer>(commandText,
            (customer, customerstate, invoice, invoicestate) =>
            {
                if (currentCustomer == null || currentCustomer.customerkey != customer.customerkey)
                {
                    customers.Add(customer);
                    currentCustomer = customer;
                }
                invoice.State = invoicestate;
                currentCustomer.Invoices.Add(invoice);
                currentCustomer.State = customerstate;
                return currentCustomer;
            }, splitOn: "statuskey,customerinvoicekey,statuskey");

但是这不起作用(省略了A和B中的状态键选择):

const string commandText =
        @"SELECT 
        A.customerkey, A.FirstName, A.LastName, A.EmailAddress,
        C.statuskey, C.Description,
        B.customerinvoicekey, B.customerkey, B.Number, B.Description, B.Total,
        D.statuskey, D.Description
        FROM Web.TestCustomers2 A
        INNER JOIN Web.TestCustomerInvoices2 B ON A.customerkey = B.customerkey
        INNER JOIN Web.TestStatus2 C ON A.statuskey = C.statuskey
        INNER JOIN Web.TestStatus2 D ON B.statuskey = D.statuskey
        ORDER BY A.customerkey";

        var customers = new List<Customer>();
        Customer currentCustomer = null;
        db.Connection.Query<Customer, State, Invoice, State, Customer>(commandText,
            (customer, customerstate, invoice, invoicestate) =>
            {
                if (currentCustomer == null || currentCustomer.customerkey != customer.customerkey)
                {
                    customers.Add(customer);
                    currentCustomer = customer;
                }
                invoice.State = invoicestate;
                currentCustomer.Invoices.Add(invoice);
                currentCustomer.State = customerstate;
                return currentCustomer;
            }, splitOn: "statuskey,customerinvoicekey,statuskey");

1 个答案:

答案 0 :(得分:1)

究竟customerinvoicekey来自哪里?

您的模型声称该表的密钥为public int customerkey { get; set; }

如果拆分不在模型中的列,则多映射函数的行为未定义。