首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Dapper映射嵌套对象的列表

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

Stack Overflow用户
提问于 2011-09-22 08:48:35
回答 5查看 112.2K关注 0票数 149

我目前正在使用实体框架来访问我的数据库,但我想看看Dapper。我有这样的类:

代码语言:javascript
复制
public class Course{
   public string Title{get;set;}
   public IList<Location> Locations {get;set;}
   ...
}

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

因此,一门课程可以在多个地点授课。实体框架会为我进行映射,因此我的课程对象会填充一个位置列表。我该如何使用Dapper来做这件事,这是可能的,还是我必须在几个查询步骤中完成它?

EN

回答 5

Stack Overflow用户

发布于 2013-07-19 22:33:10

或者,您可以将一个查询与查找一起使用:

代码语言:javascript
复制
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/

票数 202
EN

Stack Overflow用户

发布于 2017-02-23 23:27:19

我知道我来晚了,但还有另一个选择。你可以在这里使用QueryMultiple。如下所示:

代码语言:javascript
复制
var results = cnn.QueryMultiple(@"
    SELECT * 
      FROM Courses 
     WHERE Category = 1 
  ORDER BY CreationDate
          ; 
    SELECT A.*
          ,B.CourseId 
      FROM Locations A 
INNER JOIN CourseLocations B 
        ON A.LocationId = B.LocationId 
INNER JOIN Course C 
        ON B.CourseId = B.CourseId 
       AND C.Category = 1
");

var courses = results.Read<Course>();
var locations = results.Read<Location>(); //(Location will have that extra CourseId on it for the next part)
foreach (var course in courses) {
   course.Locations = locations.Where(a => a.CourseId == course.CourseId).ToList();
}
票数 37
EN

Stack Overflow用户

发布于 2014-02-14 22:16:44

少了点什么。如果没有在SQL查询中指定Locations中的每个字段,则无法填充对象Location。看一看:

代码语言:javascript
复制
var lookup = new Dictionary<int, Course>()
conn.Query<Course, Location, Course>(@"
    SELECT c.*, l.Name, l.otherField, l.secondField
    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(a);
        return course;
     },
     ).AsQueryable();
var resultList = lookup.Values;

在查询中使用l.*,我得到了位置列表,但没有数据。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7508322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档