Comment mapper des listes d'objets imbriqués avec Dapper

dapper orm

Question

J'utilise actuellement Entity Framework pour mon accès à la base de données, mais je souhaite consulter Dapper. J'ai des cours comme ça:

public class Course{
   public string Title{get;set;}
   public IList<Location> Locations {get;set;}
   ...
}

public class Location{
   public string Name {get;set;}
   ...
}

Ainsi, un cours peut être enseigné à plusieurs endroits. Entity Framework effectue le mappage pour moi afin que mon objet Course soit rempli avec une liste d'emplacements. Comment procéder avec Dapper, est-ce possible ou dois-je le faire en plusieurs étapes?

Réponse acceptée

Dapper n'est pas un ORM complet, il ne gère pas la génération magique de requêtes et autres.

Pour votre exemple particulier, ce qui suit fonctionnerait probablement:

Prenez les cours:

var courses = cnn.Query<Course>("select * from Courses where Category = 1 Order by CreationDate");

Prenez la cartographie pertinente:

var mappings = cnn.Query<CourseLocation>(
   "select * from CourseLocations where CourseId in @Ids", 
    new {Ids = courses.Select(c => c.Id).Distinct()});

Prenez les emplacements appropriés

var locations = cnn.Query<Location>(
   "select * from Locations where Id in @Ids",
   new {Ids = mappings.Select(m => m.LocationId).Distinct()}
);

Cartographier tout ça

En laissant cela au lecteur, vous créez quelques cartes et parcourez vos cours avec les emplacements.

Le caveat in astuce ne fonctionnera que si vous avez moins de 2100 lookups (Sql Server), si vous avez plus vous voulez probablement modifier la requête pour select * from CourseLocations where CourseId in (select Id from Courses ... ) si tel est le Si vous voulez bien tirer tous les résultats en une seule fois en utilisant QueryMultiple


Réponse populaire

Vous pouvez également utiliser une requête avec une recherche:

var lookup = new Dictionary<int, Course>();
conn.Query<Course, Location, Course>(@"
                SELECT c.*, l.*
                FROM Course c
                INNER JOIN Location l ON c.LocationId = l.Id                    
                ", (c, l) => {
                     Course course;
                     if (!lookup.TryGetValue(c.Id, out course)) {
                         lookup.Add(c.Id, course = c);
                     }
                     if (course.Locations == null) 
                         course.Locations = new List<Location>();
                     course.Locations.Add(l); /* Add locations to course */
                     return course;
                 }).AsQueryable();
var resultList = lookup.Values;

Voir ici https://www.tritac.com/blog/dappernet-by-example/




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