Regresar array desde db?

c# dapper sql-server

Pregunta

Tengo un procedimiento almacenado con una combinación izquierda que devuelve algo como esto:

name1  car1
name1  car2
name1  car3
name2  car1
name3  null
name4  null

Necesito almacenar este resultado en un objeto como este:

class Person 
{
    string Name;
    List<string> Cars;
}

¿Cuál es la mejor manera de hacer esto? Ya sea directamente en el procedimiento almacenado o en el código después de recuperar el resultado de la consulta.

Lo que hago ahora es una vez que tengo el resultado de db para iterar sobre él y agregar el nombre y su lista de autos c # a otro objeto si el nombre no está allí.

¿Hay una mejor solución para esto?

Respuesta popular

Supongamos que tiene dos tablas en su base de datos. Person y Cars . Para simplificar, suponga que Person tiene dos columnas PersonID, Name , mientras Cars tiene tres columnas CarID, Name, PersonID . El campo PersonID en la tabla Cars es la clave externa que vincula un automóvil a una persona.

Una simple consulta que asocia a su Persona a su Auto es

string query = @"
SELECT p.PersonID, p.Name, c.CarID, c.Name 
FROM Person p LEFT JOIN Cars c on p.PersonID = c.PersonID";

y este podría ser tu modelo

public class Person
{
    public int PersonID {get;set;}
    public string Name { get; set; }
    public List<Car> Cars {get;set;}
}
public class Car
{
    public int CarID { get; set; }
    public string Name { get; set; }
    public int PersonID {get;set;}
}

Ahora podrías escribir esto para trabajar con Dapper

var lookup = new Dictionary<int, Person>();
using (IDbConnection cnn = GetOpenConnection())
{
    var people = cnn.Query <Person, Car, Person>(query, (per, car) =>
    {
        Person found;
        if (!lookup.TryGetValue(per.PersonID, out found))
        {
            found = per;
            lookup.Add(per.PersonID, found);
            found.Cars = new List<Car>();
        }
        found.Cars.Add(car);
        return found;
    }, splitOn: "CarID").Distinct();
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué