Multi-Mapper для создания иерархии объектов

Я немного поигрался с этим, потому что похоже, что он очень похож на пример задокументированных сообщений / пользователей , но он немного отличается и не t работает на меня.

Предполагая следующую упрощенную настройку (контакт имеет несколько телефонных номеров):

public class Contact
{
    public int ContactID { get; set; }
    public string ContactName { get; set; }
    public IEnumerable 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. Таким образом, если бы у меня было 2 контакта с 2 телефонами в каждом, мой SQL вернул бы их соединение в результате набора с 4 полными строками. Затем Dapper выдает 2 объекта контактов с двумя телефонами в каждом.

Вот SQL в хранимой процедуре:

SELECT *
FROM Contacts
    LEFT OUTER JOIN Phones ON Phones.ReferenceId=Contacts.ReferenceId
WHERE clientid=1

Я пробовал это, но в итоге получил 4 кортежа (что нормально, но не то, на что я надеялся ... это просто означает, что мне все еще нужно повторно нормализовать результат):

var x = cn.Query>("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>("sproc_Contacts_SelectByClient",
                               (co, ph) => { co.Phones = ph; return co; }, 
                                             splitOn: "PhoneId", param: p,
                                             commandType: CommandType.StoredProcedure);

Я просто что-то делаю не так? Это похоже на пример сообщений / владельца, за исключением того, что я перехожу от родителя к потомку, а не от потомка к родителю.

Заранее спасибо

75
задан Ardalan Shahgholi 8 November 2013 в 08:53
поделиться