我知道这类似于在Dapper中正确使用Multimapping,但我认为它略有不同.
我有以下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; }
}
Run Code Online (Sandbox Code Playgroud)
我试图用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");
Run Code Online (Sandbox Code Playgroud)
但这不起作用(省略了A和B中的status键选择):
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");
Run Code Online (Sandbox Code Playgroud)
究竟customerinvoicekey从哪里来?
您的模型声称该表的键是public int customerkey { get; set; }。
如果您在模型中不存在的列上进行拆分,则多重映射函数的行为是未定义的。
| 归档时间: |
|
| 查看次数: |
7460 次 |
| 最近记录: |