Dapper를 사용하여 중첩 된 객체의 목록을 어떻게 매핑합니까?

dapper orm

문제

나는 현재 db 액세스를 위해 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;}
   ...
}

그래서 한 코스는 여러 장소에서 가르 칠 수 있습니다. Entity Framework에서 내 매핑을 수행하므로 내 Course 개체에 위치 목록이 채워집니다. Dapper를 사용하면 어떻게 될까요? 심지어 가능합니까? 아니면 여러 쿼리 단계에서해야합니까?

수락 된 답변

Dapper는 마술 같은 쿼리를 처리하지 않는 ORM이 아닙니다.

귀하의 특정 예제에 대한 다음과 같은 아마 작동합니다 :

잡아라 :

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

관련지도 작성 :

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

관련 위치 파악

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

그것을 모두 위로 올려라.

이를 독자에게 남겨두고 몇 개의지도를 만들고 위치로 채우는 과정을 반복합니다.

주의 할 점 in 트릭 미만의 경우 작동 2100 당신이 사항이 있다면 당신은 아마 할 쿼리를 수정하려면, 조회 (SQL 서버) select * from CourseLocations where CourseId in (select Id from Courses ... ) 이는 경우 당신은 QueryMultiple 사용하여 한 번에 모든 결과를 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는 합법적입니까? 예, 이유를 알아보십시오.