gpt4 book ai didi

当splitOn列不在子对象中时,Dapper多映射不返回空对象

转载 作者:行者123 更新时间:2023-12-04 12:38:22 24 4
gpt4 key购买 nike

我在 MySQL 中使用 dapper 1.50.2 并在尝试将左外连接子对象映射到其父对象时遇到问题。如果我拆分子对象中实际上不存在的列别名,Dapper 总是会创建一个具有默认属性的子对象,即使左连接中没有任何内容。

我创建了一个简单的示例来演示这一点:

public class ParentRecord
{
public string MemberID { get; set; }
public ChildRecord Child { get; set; }
}

public class ChildRecord
{
//public string Split { get; set; }
public string SomeField { get; set; }
}

using (MySqlConnection connection = new MySqlConnection(connectionString))
{
ParentRecord result = connection.Query<ParentRecord, ChildRecord, ParentRecord>(
@"SELECT 'FakeID' AS MemberID, NULL AS Split, NULL AS SomeField",
(mt, crt) =>
{
mt.Child = crt;
return mt;
},
splitOn: "Split").Single();
}

我希望这会导致 ParentRecord 的 Child 属性设置为 null,但 Child 属性设置为带有所有默认字段的 ChildRecord。

如果我取消对 ChildRecord 中的 Split 属性的注释,或者如果我在 SomeField 上拆分,这将按我的预期工作。

有什么好的解决方法吗?

在我处理的实际查询中,有多个具有相同名称的主键和外键字段,我不想将 POCO 中的属性名称更改为唯一的。我更喜欢能够使用就在那里拆分的列别名。我知道这通常不是 Dapper 设置为工作的方式。

任何帮助将不胜感激,谢谢。

最佳答案

发生这种情况是因为当您属性 ctr 参数时,对象 Child 初始化为默认值。然后我实现的解决方案是:

ParentRecord result = connection.Query<ParentRecord, ChildRecord, ParentRecord>(
@"SELECT 'FakeID' AS MemberID, NULL AS Split, NULL AS SomeField",
(mt, crt) =>
{
if (crt.SomeField != null){ mt.Child = crt; }
return mt;
},
splitOn: "Split").Single();

关于当splitOn列不在子对象中时,Dapper多映射不返回空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42588362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com