如何使用Dapper映射嵌套对象的列表

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (45)

我目前正在使用Entity Framework进行数据库访问,但想看看Dapper。我有这样的课程:

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

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

因此,可以在多个地点教授一门课程。实体框架为我执行映射,以便我的课程对象填充位置列表。我将如何与Dapper一起讨论这个问题,甚至可能还是需要在几个查询步骤中完成这项工作?

提问于
用户回答回答于

Dapper不是一个完整的ORM,它不处理查询等等的魔法生成。

对于您的特定示例,以下内容可能会起作用:

courses

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

将其映射到一切

留给读者的是,你创建了几张地图,并通过你的课程迭代填充地点。

in如果你的查询少于2100(Sql Server),注意这个窍门将会奏效,如果你有更多的你可能想要修改查询,select * from CourseLocations where CourseId in (select Id from Courses ... )如果是这样的话,你可以一次性使用所有结果QueryMultiple

用户回答回答于

或者,您可以使用查询来查询一个查询:

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;

看到这里https://www.tritac.com/blog/dappernet-by-example/

扫码关注云+社区

领取腾讯云代金券