2013-07-19 15 views
13

Mam jeden wiersz pochodzących z bazy danychDapper wielu obiektów z jednego rzędu

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

Korzystanie Wytworny, chciałbym ciągnąć ten wiersz w dwóch obiektach:

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 ... 
} 

Uwaga: nie ma nie ma tu związku hierarchicznego, po prostu próbuję odwzorować jeden wiersz bazy danych na dwa (lub więcej) obiektów.

Jak mogę to zrobić, korzystając z aplikacji dapper?

  • Wiem, że mogę to zrobić, zwracając dynamicznie i odwzorowując każdy obiekt ręcznie, co jest bolesne, ponieważ w moim scenariuszu mamy dużą liczbę kolumn. Wolałbym tego nie robić. (I nie, to nie może być zmieniony, aby wymagać mniej kolumn.)

Co próbowałem:

  • Przyjrzeliśmy się QueryMultiple<Person,Pet>, ale zakłada Używam wielu zapytań. W moim prawdziwym scenariuszu jest to bardzo kosztowna kwerenda i chciałbym ją uruchomić raz.
  • Sprawdziłem również powrót Query<Person,Pet,Tuple<Person,Pet>>, ale wymaga to kolumny Id, tutaj nie ma związków hierearchicznych ani Id s. Chcę tylko wziąć jeden wiersz i zamapować go na wiele kolumn.

Odpowiedz

13

Byłeś bardzo blisko rozwiązania z metodą Query. Jeśli nie masz kolumnę Id, wtedy można zapewnić splitOn argument:

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

jestem brakuje czegoś? Nawet gdy dostarczam 'splitOn', nadal otrzymuję' ArgumentException: Używając interfejsów API multi-mapping, upewnij się, że ustawiłeś parametr splitOn, jeśli masz klucze inne niż Id. Nazwa parametru: splitOn' –

+0

To dziwne. może być konieczne wyświetlenie dokładnego zapytania SQL i kodu. nie jest prawdopodobne, ale może twoje pole splitOn istnieje również w pierwszym typie, i masz na myśli włączyć go do drugiego typu, przez przypadek? –

+0

Masz rację, kiedy używam go z tym scenariuszem zabawek, działa dobrze. Będę musiał zagłębić się i dowiedzieć, gdzie moje rzeczy idą źle w moim prawdziwym kodzie. –

Powiązane problemy