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

dapper orm

我目前正在使用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;}
   ...
}

因此,可以在多個地點教授一門課程。實體框架為我做了映射,因此我的Course對象填充了一個位置列表。我如何與Dapper一起解決這個問題,是否可能或者我必須在幾個查詢步驟中進行此操作?

一般承認的答案

Dapper並不是一個完整的ORM它不會處理魔法生成的查詢等。

對於您的特定示例,以下可能會起作用:

抓住課程:

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/



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因