Синтаксис Dapper для вложенного мультикартинга
class Person
{
Address Addr { get; set; }
int Age { get; set; }
}
class Address
{
string StreetName { get; set; }
County Cnty { get; set; }
}
class County
{
string CntyName;
string CntyCode;
}
Вот мой сохраненный Proc, который заполняет данные из базы данных.
Create Procedure SpGetAllPersons
As
Select CntyName, CntyCode, StreetName, Age from Persons
Я пытался написать ниже грубый запрос, но получил исключение
DBConn.Query<County, Address , Person, Person>
(DomainConstants.SpGetAllPersons,
(cnty, address, person) =>
{
address.Cnty = cnty;
person.Addr = address;
return person;
},
commandType: CommandType.StoredProcedure,
splitOn: "StreetName, Age").ToList();
Я попытался использовать приведенную ниже концепцию, но она возвращает только один объект. Мне нужен список людей.
var sql =
@"select
1 as PersonId, 'bob' as Name,
2 as AddressId, 'abc street' as Name, 1 as PersonId,
3 as Id, 'fred' as Name
";
var personWithAddress = connection.Query<Person, Address, Extra, Tuple<Person, Address, Extra>>
(sql, (p, a, e) => Tuple.Create(p, a, e), splitOn: "AddressId,Id").First();
Заранее спасибо.
2 ответа
Решение
Спасибо Марку и Бобу за то, что они прыгнули на него. Я смог решить проблему другим способом:
DBConn.Query(DomainConstants.SpGetAllPersons, commandType: CommandType.StoredProcedure)
.Select(x => new Person
{
Addr = new Address
{
Cnty = new County
{
CntyName = x.CntyName,
CntyCode = x.CntyCode
},
StreetName = x.StreetName
},
Age = x.Age
}).ToList();
Ну, в этом примере вы выбираете только одну строку, чтобы она никогда не возвращала больше одной. Тем не мение, Query<T>
возвращает IQueryable<T>
, Ты звонишь .First()
Поэтому неудивительно, что вы получите ровно один результат. Если вы измените последнюю часть вашего заявления, чтобы использовать .ToList()
Вы получите список с одним элементом в строке.