Я немного поигрался с этим, потому что похоже, что он очень похож на пример задокументированных сообщений / пользователей , но он немного отличается и не 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);
Я просто что-то делаю не так? Это похоже на пример сообщений / владельца, за исключением того, что я перехожу от родителя к потомку, а не от потомка к родителю.
Заранее спасибо