我一直在玩这个游戏,因为它看起来很像所记录的帖子/用户示例,但它略有不同,对我不起作用。
假定以下简化设置(联系人具有多个电话号码):
public class Contact
{
public int ContactID { get; set; }
public string ContactName { get; set; }
public IEnumerable<Phone> Phones { get; set; }
}
public class Phone
{
public int PhoneId { get; set; }
public int ContactID { get; set; } // foreign key
public string Number { get; set; }
public string Type { get; set; }
public bool IsActive { get; set; }
}
我很乐意以返回带有多个Phone对象的Contact的结尾。这样,如果我有2个联系人,每个联系人有2部手机,那么我的SQL将返回这些联系人的联接,结果集共有4行。然后Dapper将弹出两个带有两个电话的联系人对象。
这是存储过程中的SQL:
SELECT *
FROM Contacts
LEFT OUTER JOIN Phones ON Phones.ReferenceId=Contacts.ReferenceId
WHERE clientid=1
我尝试了一下,但最终得到了4个元组(这是可以的,但是不是我想要的...这只是意味着我仍然必须对结果进行重新规范化):
var x = cn.Query<Contact, Phone, Tuple<Contact, Phone>>("sproc_Contacts_SelectByClient",
(co, ph) => Tuple.Create(co, ph),
splitOn: "PhoneId", param: p,
commandType: CommandType.StoredProcedure);
当我尝试下面的另一种方法时,出现了一个异常“无法将类型为'System.Int32'的对象转换为类型为'System.Collections.Generic.IEnumerable'1 [Phone]'”。
var x = cn.Query<Contact, IEnumerable<Phone>, Contact>("sproc_Contacts_SelectByClient",
(co, ph) => { co.Phones = ph; return co; },
splitOn: "PhoneId", param: p,
commandType: CommandType.StoredProcedure);
我是在做错什么吗?看起来就像帖子/所有者的示例一样,只是我要从父级转到子级,而不是从子级转到父级。