Petapoco의 다중 매핑으로 여러 개의 JOIN을 처리 할 수 ​​있습니까?

dapper join mapping petapoco

문제

Petapoco를 사용하여 채울 목록 개체가 있습니다.

클래스 속성과 이름이 데이터베이스 스키마를 처리합니다. 주요 클래스는 Issue 이며, 데이터베이스 스키마와 이름 및 속성이 일치하는 다른 두 클래스 인 ConditionSeverityLevel 과 관련됩니다.

var Results = Db.Fetch<Issue, SeverityLevel, Issue>(
    (i, sl) => { 
        i.CurrentSeverityLevel = sl;
        return i;
    },
    "SELECT /* ..shortened.. */ FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "WHERE Issue.Id=@0", issueId);

실제로 문제 목록을 검색 할 때 단일 명령을 사용하여 문제 목록 및 관련 SeverityLevel 을 검색하기 위해 다중 매핑 기능을 사용하고 있습니다.

var Results = Db.Fetch<Issue, SeverityLevel, Issue>(
    (i, sl) => { 
        i.CurrentSeverityLevel = sl;
        return i;
    },
    "SELECT /* ..shortened.. */ FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "WHERE Issue.Id=@0", issueId);

이제 Petapoco는 여러 개의 JOINS를 처리하지 못하기 때문에 검색된 각 문제에 SourceConditionTargetCondition 을 첨부하기위한 두 번째 단계를 수행해야합니다.

이렇게하려면 다음 중 하나를 수행 할 수 있습니다.

  • foreach 루프에서 읽기 후에 소스 조건과 대상 조건을 첨부하고,
  • 또는 Condition의 전체 목록을 검색 한 다음 동일한 종류의 for-each를 사용하여 각 Issue에 첨부하십시오.

지금은 데이터베이스에 제한된 조건 집합이 있기 때문에 두 번째 솔루션을 사용하고 있습니다.

어쨌든 JOINED 테이블을 추가 할 때 수행 할 쿼리가 거의 필요하므로이 방법을 사용하기에는 다소 무리가 있습니다.

이런 일을 성취 할 수 있을지 궁금합니다.

var Results = Db.Fetch<Issue, SeverityLevel, Issue>(
    (i, sl) => { 
        i.CurrentSeverityLevel = sl;
        return i;
    },
    "SELECT /* ..shortened.. */ FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "WHERE Issue.Id=@0", issueId);

친애하는 Petapoco 사용자, 친애하는 Petapoco 저자는 이것을 처리 할 수있는 방법입니까?

대신 Dapper를 사용하여이 작업을 처리 할 수 ​​있습니까 (가능한 경우 ...). 업데이트 / 삽입 작업을 위해 Petapoco를 유지하고 싶습니다.

수락 된 답변

이 작업을 수행 할 수 있어야합니다.

var Results = Db.Fetch<Issue, SeverityLevel, Condition, Condition, Issue>(
    (i, sl, c1, c2) => { 
        i.CurrentSeverityLevel = sl;
        i.SourceCondition = c1;
        i.TargetCondition = c2;
        return i;
    },
    "SELECT Issue.*, SeverityLevel.*, Con1.*, Con2.* FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "LEFT JOIN Condition Con1 ON Con1.Id = Issue.SourceConditionId " + 
    "LEFT JOIN Condition Con2 ON Con2.Id = Issue.TargetConditionId " + 
    "WHERE Issue.Id=@0", issueId);

나는 이것을 시험하지 않았다. 나는 이것을 자동화하는 방법을 연구 중이다.

그것은 선택된 열은 매개 변수 유형은 것과 같은 순서로되어 정말 중요합니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.