2011-05-26 3 views
7

J'ai une structure de code comme ci-dessous:écriture Dapper requête pour des objets Nested

class Person 
{ 
    Name PersonName; 
    int Age; 
} 

class Name 
{ 
    string FirstName { get; set; } 
    string LastName { get; set; } 
} 

Voici mon procédure stockée qui renseigne les données de base de données. Comment écrire une requête Dapper qui extrait toute la personne de la base de données?

Exemple:

List<Person> Persons = DbConn.Query<Person>("SpGetAllPersons", CommandType.StoredProcedure);

Répondre

8

Vous devez utiliser multi mappeur si vous souhaitez sélectionner des objets imbriqués.

Cela devrait fonctionner:

List<Person> persons = DbConn.Query<Name,Person,Person> 
    ("SpGetAllPersons", 
    (name,person) => {person.Name = name; return person;} 
    commandType: CommandType.StoredProcedure, 
    splitOn: "Age"); 

Le multi-mappeur peut retourner tout type, même juste un type global qui ne sont pas mis en correspondance avec une table db.

Il est important de fournir le paramètre splitOn si vous avez l'intention de diviser sur tout ce qui n'est pas appelé id ou Id.

+0

Cela n'a pas fonctionné pour moi. J'ai dû permuter la position de Name: '.Query (..., (personne, nom) => ...)'. En outre, splitOn: "Age" ne fonctionne pas non plus pour moi - Je reçois toujours cette erreur: "Lorsque vous utilisez les API multi-mapping, assurez-vous de définir le paramètre splitOn si vous avez des clés autres que Id" – Trev

+0

J'ai mal compris ce que splitOn était réellement faire ... cette partie fonctionne bien ... mais j'avais encore besoin d'échanger 'Name' – Trev