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

时间:2011-07-15 09:48:26

标签: c# .net 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 }
    ...
}

然后我运行这样的查询:

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

1 个答案:

答案 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"