我正在使用dapper 1.50.2与MySQL并遇到一个问题,试图将左外连接子对象映射到其父对象。如果我拆分了子对象中实际不存在的列别名,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如何开始工作的。
任何帮助都将不胜感激,谢谢。
答案 0 :(得分:0)
之所以发生这种情况,是因为当您为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();