我有两个班级:
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或者这是一个错误吗?
答案 0 :(得分:6)
它正在尝试对FooId
进行拆分,因此每次看到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
没有被包含在第二个对象中的原因,以及为什么将它添加到最后使它工作的原因。
另一种用法IIRC接受序列键分开;你会用:
splitOn: "FooId,BarId"