c# - Dapper 多选 : Nested class primary key doesn't map unless using "AS"

标签 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 还是这是一个错误?

最佳答案

它试图对 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"

关于c# - Dapper 多选 : Nested class primary key doesn't map unless using "AS",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6705270/

相关文章:

c# - 创建新实例或仅设置内部变量

.net - 有什么方法可以在 azure 事件中心中使用 EventProcessorHost 检索跳过的事件吗?

.net - 在 Visual Studio 中运行 Webpack-dev-server - .net core 项目

c# - 使用 LINQ 选择具有不同列值的行

C# 在处理字符串时使用正则表达式

c# - 了解享元模式

c# - C# 中的基本数据结构

sql - 在基于多列的 SQL 查询中返回排名

sql - 不使用 NewID() 的 SQL 上的随机数

MySQL:找到 max(created_at),其中 another_column in (a,b,...)