Уплотнить несколько объектов из одной строки - программирование

Уплотнить несколько объектов из одной строки

У меня есть одна строка, поступающая из базы данных

select "John" Name, 
       "Male" Gender,
       20 Age,
       "Rex" PetName,
       "Male" PetGender,
       5 PetAge
       // ... many more ...

Используя Dapper, я хотел бы потянуть эту строку на два объекта:

class Person
{
    public string Name { get; set; }
    public string Gender { get; set; }
    public int Age { get; set; }
    // ... many more ...
}    
class Pet
{
    public string PetName { get; set; }
    public string PetGender { get; set; }
    public int PetAge { get; set; }
    // ... many more ...
}

Примечание: здесь нет иерархических отношений, я просто пытаюсь сопоставить одну строку базы данных с двумя (или более) объектами.

Как я могу сделать это с помощью dapper?

  • Я знаю, что могу это сделать, возвращая динамику и сопоставляя каждый объект вручную, что является болезненным, поскольку в моем сценарии у нас есть большое количество столбцов. Я бы предпочел не делать этого. (И нет, он не может быть перепроектирован, чтобы требовать меньше столбцов.)

Что я пробовал:

  • Я просмотрел QueryMultiple<Person,Pet>, но предполагает, что я запускаю несколько запросов. В моем реальном сценарии это очень дорогостоящий запрос, и я хотел бы просто запустить его один раз.
  • Я также просмотрел возвращаемый Query<Person,Pet,Tuple<Person,Pet>>, но для этого требуется столбец Id, здесь нет иерархического отношения или Id s. Я просто хочу взять одну строку и сопоставить ее с несколькими столбцами.
4b9b3361

Ответ 1

Вы были близки к решению с помощью метода Query. Если у вас нет столбца Id, вы можете предоставить аргумент splitOn:

connection.Query<Person, Pet, Tuple<Person, Pet>>(sql, 
    (person, pet) => Tuple.Create(person, pet), splitOn: "PetName");