我知道这与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");
答案 0 :(得分:1)
究竟customerinvoicekey
来自哪里?
您的模型声称该表的密钥为public int customerkey { get; set; }
。
如果拆分不在模型中的列,则多映射函数的行为未定义。