最佳答案
我一直在玩这一点,因为它似乎感觉很像 有文件记录的文章/用户示例,但它略有不同,并没有为我工作。
假设有以下简化的设置(联系人有多个电话号码) :
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’的对象。输入‘ System’。收款。泛型,可枚举的‘1[电话]’。”
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);
我是不是做错了什么?它看起来就像 post/owner 示例一样,只不过我是从父节点到子节点,而不是从子节点到父节点。
先谢谢你