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?
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:
var courses = cnn.Query<Course>("select * from Courses where Category = 1 Order by CreationDate");
var mappings = cnn.Query<CourseLocation>(
"select * from CourseLocations where CourseId in @Ids",
new {Ids = courses.Select(c => c.Id).Distinct()});
var locations = cnn.Query<Location>(
"select * from Locations where Id in @Ids",
new {Ids = mappings.Select(m => m.LocationId).Distinct()}
);
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
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;