Joa*_*kim 3 .net c# sql dapper
我有两节课:
class Foo{
public int FooId { get; set; }
...
public Bar Bar { get; set }
}
class Bar{
public int BarId { get; set; }
public int FooId { get; set }
...
}
Run Code Online (Sandbox Code Playgroud)
当我然后运行这样的查询:
sqlConnection.Query<Foo, Bar, Foo>(
"SELECT * FROM Foo JOIN Bar ON Foo.FooId = Bar.FooId",
(foo, bar) => {
foo.Bar = bar;
return foo;
},
splitOn: "FooId");
Run Code Online (Sandbox Code Playgroud)
结果将是Foo和Bar上的所有属性都将映射除了Bar.BarId.检查列名并在我的Bar类中键入数据库后,我仍然找不到任何差异.
我偶然发现的一件奇怪的事情是,如果我写道:
"SELECT *, BarId AS BarId FROM Foo JOIN Bar ON Foo.FooId = Bar.FooId"
Run Code Online (Sandbox Code Playgroud)
Bar.BarId实际上按预期映射,我误解了如何使用Dapper或者这是一个错误吗?
它试图进行拆分FooId,因此每次看到FooId它都在削减数据.此用例主要用于(并非罕见)场景,其中所有表都具有可预测的键,例如Id.在您的情况下,当您从数据库获取时,这不是您想要的:
FooId, a, b, c | BarId, FooId, x, y, z
^^ from Foo ^^ | ^^ from Bar ^^
Run Code Online (Sandbox Code Playgroud)
然而,这分裂FooId为:
FooId, a, b, c, BarId | FooId, x, y, z
Run Code Online (Sandbox Code Playgroud)
这就是为什么BarId不包含在第二个对象中,以及为什么将它添加到最终使它工作.
还有另一种用法,即IIRC,接受按顺序分配的键; 你会用:
splitOn: "FooId,BarId"
Run Code Online (Sandbox Code Playgroud)