2011-05-26 19 views
7

que tienen una estructura de código de la siguiente manera:escritura Dapper consultas para anidada Objetos

class Person 
{ 
    Name PersonName; 
    int Age; 
} 

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

Aquí está mi procedimiento almacenado, que rellena los datos de la base de datos.

Create Procedure SpGetAllPersons 
As 
Select FirstName, LastName, Age from Persons 

¿Cómo escribo la consulta Dapper que extrae a toda la persona de la base de datos?

Ejemplo:

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

Respuesta

8

Es necesario utilizar el asignador de múltiples si desea seleccionar objetos anidados.

Esto debería funcionar:

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

El multi-asignador puede devolver cualquier tipo, incluso sólo un tipo de agregado que no se asigna a ninguna tabla db.

Es importante proporcionar el parámetro splitOn si tiene la intención de dividir algo que no se llame id o Id.

+0

Esto no funcionó para mí. Tuve que cambiar la posición de Nombre: '.Query (..., (persona, nombre) => ...)'. Además, splitOn: "Age" tampoco funciona para mí. Sigo recibiendo este error: "Cuando utilizo las API de mapeo múltiple me aseguro de configurar el parametro splitOn si tiene claves distintas a Id" – Trev

+0

. Entendí mal qué splitOn era realmente haciendo ... esa parte está funcionando bien ... pero todavía necesito cambiar 'Nombre' – Trev