我有两节课:
class Foo{ public int FooId { get; set; } ... public Bar Bar { get; set } } class Bar{ public int BarId { get; set; } public int FooId { get; set } ... }
当我然后像这样运行查询时:
sqlConnection.Query<Foo, Bar, Foo>( "SELECT * FROM Foo JOIN Bar ON Foo.FooId = Bar.FooId", (foo, bar) => { foo.Bar = bar; return foo; }, splitOn: "FooId");
结果将是Foo和Bar上的所有属性都将映射为Bar.BarId除外。在检查了列名并针对我的Bar类输入数据库后,我仍然找不到任何区别。
我偶然发现的一件奇怪的事是,如果我写了:
"SELECT *, BarId AS BarId FROM Foo JOIN Bar ON Foo.FooId = Bar.FooId"
Bar.BarId实际上按预期映射,我是否误解了如何使用Dapper或这是一个错误?
它试图对进行拆分FooId,因此每次看到FooId它都在切割数据时。该用例 本质上 用于(所有情况下的)表具有可预测键(例如)的(不常见)场景Id。就您而言,这不是您想要的,因为您可以从数据库中获得:
FooId
Id
FooId, a, b, c | BarId, FooId, x, y, z ^^ from Foo ^^ | ^^ from Bar ^^
但是,这分为FooId:
FooId, a, b, c, BarId | FooId, x, y, z
这就是为什么BarId不包含在第二个对象中,以及为什么将其添加到末尾使其起作用的原因。
BarId
IIRC还有另一种用法,它接受 顺序的 密钥进行分割。您将使用:
splitOn: "FooId,BarId"