Retourne le tableau de db?

c# dapper sql-server

Question

J'ai une procédure stockée avec une jointure à gauche qui renvoie quelque chose comme ceci:

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

Je dois stocker ce résultat dans un objet comme celui-ci:

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

Quelle est la meilleure façon de procéder? Soit directement dans la procédure stockée ou dans le code après avoir récupéré le résultat de la requête.

Ce que je fais maintenant, c'est une fois que j'ai le résultat de db pour itérer dessus et ajouter le nom et la liste de ses voitures c # à un autre objet si name n'est pas déjà là.

Y a-t-il une meilleure solution à cela?

Réponse populaire

Supposons que vous ayez deux tables dans votre base de données. Person et Cars . Pour plus de simplicité, supposons que Person ait deux colonnes PersonID, Name , tandis que Cars a trois colonnes: CarID, Name, PersonID . Le champ PersonID dans la table Cars est la clé étrangère qui relie une voiture à une personne.

Une requête simple qui associe votre personne à votre voiture est

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

et cela pourrait être votre modèle

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

Maintenant, vous pouvez écrire ceci pour travailler avec 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();
}


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi