3

我有两节课:

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 或者这是一个错误?

4

1 回答 1

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"
于 2011-07-15T10:35:07.603 回答