Ich weiß, dass dies der korrekten Verwendung von Multi-Mapping in Dapper ähnlich ist, aber ich denke, es ist etwas anders.
Ich habe die folgende POCO-Struktur:
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; }
}
Ich versuche, dies mit Dapper zu mappen und verwende keine Id für meine Splitpunkte. Ich kann es zur Arbeit bringen, wenn ich die Schlüssel verdopple, aber ich bin nicht sicher, warum ich das tun muss.
Warum funktioniert das?
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");
Aber das funktioniert nicht (die Auswahl des Statusschlüssels in A und B wird weggelassen):
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");
Woher kommt der customerinvoicekey
Rechnungs-Schlüssel?
Ihr Modell behauptet, der Schlüssel für die Tabelle sei public int customerkey { get; set; }
.
Wenn Sie eine Spalte teilen, die nicht in Ihren Modellen enthalten ist, ist das Verhalten der Multi-Mapping-Funktionen nicht definiert.