多映射器创建对象层次结构

我一直在玩这个游戏,因为它看起来很像所记录的帖子/用户示例,但它略有不同,对我不起作用。


假定以下简化设置(联系人具有多个电话号码):


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);

我是在做错什么吗?看起来就像帖子/所有者的示例一样,只是我要从父级转到子级,而不是从子级转到父级。


翻阅古今
浏览 599回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP