Ich habe zwei Klassen:
class Foo{
public int FooId { get; set; }
...
public Bar Bar { get; set }
}
class Bar{
public int BarId { get; set; }
public int FooId { get; set }
...
}
wenn ich dann die Abfrage wie folgt ausführen:
sqlConnection.Query<Foo, Bar, Foo>(
"SELECT * FROM Foo JOIN Bar ON Foo.FooId = Bar.FooId",
(foo, bar) => {
foo.Bar = bar;
return foo;
},
splitOn: "FooId");
Das Ergebnis wäre dann, dass alle Eigenschaften auf Foo und Bar mit Ausnahme von Bar.BarId zugeordnet werden. Nach dem Überprüfen des Spaltennamens und dem Eintippen der Datenbank gegen meine Bar-Klasse konnte ich immer noch keine Unterschiede finden.
Eine seltsame Sache, über die ich gestolpert bin, war, dass wenn ich schrieb:
"SELECT *, BarId AS BarId FROM Foo JOIN Bar ON Foo.FooId = Bar.FooId"
Bar.BarId tatsächlich wie erwartet abgebildet, habe ich missverstanden wie man Dapper benutzt oder ist das ein Bug?
Es versucht eine Aufteilung auf FooId
, so dass jedes Mal, FooId
es FooId
sieht, die Daten abgeschnitten werden. Dieser Anwendungsfall ist im Wesentlichen für das (nicht unübliche) Szenario gedacht, in dem alle Tabellen einen vorhersehbaren Schlüssel wie die Id
. In Ihrem Fall ist dies nicht das, was Sie wollen, wie Sie von der Datenbank bekommen:
FooId, a, b, c | BarId, FooId, x, y, z
^^ from Foo ^^ | ^^ from Bar ^^
Dies teilt sich jedoch auf FooId
auf:
FooId, a, b, c, BarId | FooId, x, y, z
Aus diesem Grund wird BarId
nicht in das zweite Objekt eingeschlossen, und auch warum es am Ende hinzugefügt wird, funktioniert.
Es gibt eine andere Verwendung, IIRC, die die sequenzierten Schlüssel zum Teilen akzeptiert; Sie würden verwenden:
splitOn: "FooId,BarId"