Я немного поиграл с этим, потому что кажется, что он очень похож на задокументированные сообщения/примеры пользователей, но он немного отличается и не работает для меня.
Предполагая следующую упрощенную настройку (контакт имеет несколько телефонных номеров):
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; }
}
Мне бы очень хотелось получить что-то, что возвращает контакт с несколькими объектами телефона. Таким образом, если бы у меня было 2 контакта, с двумя телефонами каждый, мой SQL вернул бы объединение этих элементов в виде набора результатов с 4 полными строками. Затем Dapper вытащил бы 2 контакта с двумя телефонами каждый.
Вот SQL в хранимой процедуре:
SELECT *
FROM Contacts
LEFT OUTER JOIN Phones ON Phones.ReferenceId=Contacts.ReferenceId
WHERE clientid=1
Я попробовал это, но закончил с 4 Tuples (это нормально, но не то, на что я надеялся... это просто означает, что мне все равно придется нормализовать результат):
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);
Я просто делаю что-то неправильно? Это похоже на пример posts/owner, за исключением того, что я перехожу от родителя к потомку, а не к родительскому.
Заранее спасибо