小编典典

Dapper多重选择:除非使用“淎S”,否则嵌套类的主键不会映射。

sql

我有两节课:

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


阅读 234

收藏
2021-04-07

共1个答案

小编典典

它试图对进行拆分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"
2021-04-07