Dapper multiselect:除非使用"AS",否则嵌套类主键不会映射

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

Mar*_*ell 6

它试图进行拆分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)